比较两个不同长度的数组并返回一个具有不常见元素的数组

问题描述:

在这里,我有两个不同长度的数组。然后一个数组将返回两个数组中不常见的值。但编译器给出错误的输出。这些功能有哪些问题? 输出:在这种情况下[4,5]而不是[4]。比较两个不同长度的数组并返回一个具有不常见元素的数组

function diffArray(arr1, arr2) { 
    var newArr = []; 
    var y=[]; 
    var z=[]; 
    // Same, same; but different. 
    var flag=0; 
    for(var i=0;i<arr1.length;i++){ 
    if(arr2.indexOf(arr1[i]===-1)){ 
     z=arr1.slice(i,i+1); 
     //return z; 
    } 
    for(var j=0;j<arr2.length;j++){ 
     if(arr1.indexOf(arr2[j])===-1){ 
     y=arr2.slice(j,j+1); 
     //z=arr1.slice(i,i+1); 
     //break; 
     } 
    } 
    } 
    return newArr.concat(y,z); 
} 

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]); 
diffArray(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]); 
+0

'编译器是给错了output'? –

+0

[4,5]作为输出而不是[5] @sᴜʀᴇsʜᴀᴛᴛᴀ – aayushi

+0

为什么你期待[5]?并不罕见[4] –

代码,书面,只能返回最多两个项目,因为yz总是与长度为1的新阵列时z=arr1.slice(i,i+1);y=arr2.slice(j,j+1);被称为覆盖。您可能想要使用Array.push,即z.push(arr1[i]);y.push(arr2[j]);。这会在每次找到元素时添加到同一个数组中,而不是每次都重置结果数组。

+0

即使使用push(),预期的输出也不会发生! @dncook – aayushi

尝试以下操作:

function diffArray (arr1, arr2) { 
    var z = arr1.filter(function (value) { return !~arr2.indexOf(value); }); 
    var y = arr2.filter(function (value) { return !~arr1.indexOf(value); }); 

    return [].concat(y, z); 
} 
+0

将“conact”更改为“concat”也许...... – gyre

+0

哦,是的。当然。 Thx – floriangosse

+0

做什么!〜操作员呢?我无法在谷歌上找到它。 @floriangosse – aayushi

您可以尝试为你的函数

a1 = [1, 2, 3, 5]; 
a2 = [1, 2, 3, 4, 5]; 
result = []; 
if (a1.length > a2.length) { 
    temp = a1; 
    a1 = a2; 
    a2 = temp; 
} 

$.grep(a2, function(k) { 
     if ($.inArray(k, a1) == -1) result.push(k); 
}); 
console.log(result);, 

这里的替代工作jsfiddle您都阵列集。

试试看,这会起作用。

+0

在这种情况下,如果arr1的大小大于arr2,该怎么办? @rahul_m – aayushi

+0

我已经添加了更小和更大的条件,检查函数(k)中的语句 – rahulsm

+0

是否会自动从a2中取值,还是需要在某处定义它?我是javascript新手 – aayushi

您可以合并数组并返回唯一值。

function diffArray(a1, a2){ 
 
    var data = a1.concat(a2); 
 
    return data.filter(function(item, i, a){ 
 
    return a.indexOf(item) === a.lastIndexOf(item) 
 
    }); 
 
} 
 

 
console.log(diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5])); 
 
console.log(diffArray([1, 2, 3, 5], [11, 12, 13, 14, 5]));

试试这个

var newArr = []; 
    function diffArray(arr1, arr2) { 


      arr1.forEach(function (item) { 
       if (arr2.indexOf(item) === -1) 
        newArr.push(item); 
      }); 

      arr2.forEach(function (item) { 
       if (arr1.indexOf(item) === -1) 
        newArr.push(item); 
      }); 

    } 

    diffArray(["andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]); 
+0

[“安山”,“草地”,“污垢”,“粉红色的羊毛”,“死亡的灌木”],[“闪长岩”,“安山岩”,“草”,“污垢” “]应该返回[”闪长岩“,”粉红色的羊毛“]。它不适用于此! @Mairaj – aayushi

+0

@aayushi更新了答案。 – Mairaj

在你的代码有这样几行:

z=arr1.slice(i,i+1); 
y=arr2.slice(j,j+1); 

如果你这样做,每次你得到一个独特的元素,你将失去之前存储的一个。

另外,Array.prototype.slice返回一个数组,因此您也不需要使用slice()

function diffArray(arr1, arr2) { 
    var newArr = []; 
    var y=[]; 
    var z=[]; 

    var flag=0; 
    for(var i=0;i<arr1.length;i++) { 
    if(arr2.indexOf(arr1[i])===-1) { 
     z.push(arr1[i]); 
    } 
    } 

    for(var j=0;j<arr2.length;j++) { 
    if(arr1.indexOf(arr2[j])===-1) { 
     y.push(arr2[j]); 
    } 
    } 

    return y.concat(z); 
} 

这应该对您有帮助。

这里是一个fiddle显示相同。

function diffArray(arr1, arr2) { 
    var newArr = []; 

    var firstArray = arr1; 
    var secondArray = arr2; 
    if (arr2.length > arr1.length) { 
    firstArray = arr2; 
    secondArray = arr1; 
    } 

    var isNotMatched = false; 

    for (var i in firstArray) { 
    for (var j in secondArray) { 
     if (firstArray[i] !== secondArray[j]) { 
     isNotMatched = true; 
     } else { 
     isNotMatched = false; 
     break; 
     } 

    } 

    if (isNotMatched) 
     newArr.push(firstArray[i]); 

    } 

    return newArr; 
} 

diffArray([1, 2, 3, 5], [1, 2, 3, 4, 5]); 

所有

function diffArray(arr1, arr2) { 
    var newArr = []; 
    var firstArray = arr1; 
    var secondArray = arr2; 
    if (arr2.length > arr1.length) { 
    firstArray = arr2; 
    secondArray = arr1; 
    } 

    var whenSameLegth = ''; 
    var isNotMatched = false; 

    for (var i in firstArray) { 
    for (var j in secondArray) { 
     if (firstArray[i] !== secondArray[j]) { 
     isNotMatched = true; 
     whenSameLegth = secondArray[j]; 
     } else { 
     isNotMatched = false; 
     break; 
     } 

    } 
    if (isNotMatched && arr2.length === arr1.length) { 
     newArr.push(firstArray[i]); 
     newArr.push(whenSameLegth); 
    } else if (isNotMatched) { 
     newArr.push(firstArray[i]); 
    } 
    } 

    return newArr; 
} 

diffArray(第2版工作[ “安山岩”, “小草”, “泥土”, “粉红色羊毛”, “死灌木”],[ “闪长岩”, “安山”,“草”,“污垢”,“死亡的灌木”]);

+0

请使用上面的功能它工作我检查。 –

+0

[“安山岩”,“草地”,“泥土”,“粉红色的羊毛”,“死亡的灌木”],[“闪长岩”,“安山岩”,“草地”,“泥土” “闪石”,“粉红色的羊毛”]。它不适用于此! @ love-Kesh – aayushi

+0

请现在检查第二个verion @aayushi –

如果您可以使用最新版本的JavaScript(ES6),下面的代码应该能够在线性时间内运行,而不是二次时间 - O(N)与O(N²)。

function diffArray(a, b) { 
 
    a = new Set(a) 
 
    let result = [] 
 
    for (let value of b) { 
 
    a.delete(value) || result.push(value) 
 
    } 
 
    result.push(...a) 
 
    return result 
 
} 
 

 
console.log(diffArray(
 
    [1, 2, 3, 5], 
 
    [1, 2, 3, 4, 5] 
 
)) 
 
console.log(diffArray(
 
    ["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], 
 
    ["diorite", "andesite", "grass", "dirt", "dead shrub"] 
 
))

你可以使用一个哈希表和计数的发生。它也适用于数组中的多个equla元素。

function getSymmetricDifference(a1, a2) { 
 
    var hash = {}; 
 
    a1.forEach(function (a) { 
 
     (hash[a] = hash[a] || { count: 0, value: a }).count++; 
 
    }); 
 
    a2.forEach(function (a) { 
 
     (hash[a] = hash[a] || { count: 0, value: a }).count--; 
 
    }); 
 
    return Object.keys(hash).filter(function (a) { return hash[a].count; }).map(function (a) { return hash[a].value; }); 
 
} 
 

 
console.log(getSymmetricDifference([1, 2, 3, 5], [1, 2, 3, 4, 5])); 
 
console.log(getSymmetricDifference(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"]));