找出两个数组之间的对称差异

时间:2016-10-24 23:16:30

标签: javascript algorithm symmetric-difference

我想找到两个阵列之间的对称差异。 This implementation有效,但是我想编写一个仅针对两个数组的函数,而不是一个找到一堆数组之间对称差异的函数。功能应该是这样的:

function diffArray(arr1, arr2) { }

然后返回一个具有对称差异的新数组。

到目前为止,我最好的尝试是

var newArr = [];
    for (var i = 0; i < arr1.length; i++){
      var x = arr[i]; 
    for (var n = 0; n < arr2.length; n++){
      var y = arr2[n];
      if (y === x){
        break;
       } else {
      newArr.push(y);
    }
  }
 }

然而,我知道这甚至不是很接近。问题(这是FreeCodeCamp的算法问题)提示在实现中使用方法array.filter(),array.indexOf(),array.concat(),array.slice()。 我理解一般的想法是将每个元素放在一个数组中(在我的例子中是第一个),然后将它与第二个数组中的每个元素进行比较。如果未找到匹配项,请将该元素推送到newArr中。

任何人都可以帮助使用上述方法的声音实现,并提供有关其工作方式的可靠解释/评论吗?

谢谢!

4 个答案:

答案 0 :(得分:2)

这是另一个想法:

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

    return arr1.filter(function(val) {
        return arr2.indexOf(val) === -1;
    })
    /*the method above, returns a new array, so you can chain it
          to concat with the array returned from the filter() method
          in the arr2...*/

        .concat(arr2.filter(function(val) {
            return arr1.indexOf(val) === -1;
        }));
}

答案 1 :(得分:1)

好的。我解决了它,但我认为它仍然可以做得更好。

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

  function inArray2(value){
      if(arr2.indexOf(value) == -1){
        return true;
      }
    return false;
  }

  function inArray1(value){
    if(arr1.indexOf(value) == -1){
      return true;
    }
    return false;
  }

  var arr1Filtered = arr1.filter(inArray2);
  var arr2Filtered = arr2.filter(inArray1);

  newArray = arr1Filtered.concat(arr2Filtered);
  return newArray;
}

由于这通过了所有测试用例,我认为它适用于所有情况。呼。

更新:新的和改进的算法,感谢来自torazaburo的有用输入。希望这有助于任何同样坚持这一挑战的人。

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

   function notInArray2(value){
       return arr2.indexOf(value) === -1;
   }
   function notInArray1(value){
     return arr1.indexOf(value) === -1;
   }

   var arr1Filtered = arr1.filter(notInArray2);
   var arr2Filtered = arr2.filter(notInArray1);

   newArray = arr1Filtered.concat(arr2Filtered);
   return newArray;
}

答案 2 :(得分:1)

这是我的简单解决方案

function diffArray(a, b){
c = a.concat(b)
d = [];
var diffarr = c.filter(function(c1){
   if (a.indexOf(c1) === -1 || b.indexOf(c1) === -1){
        d.push(c1)
   }
})
return d;}

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

答案 3 :(得分:0)

这可以通过组合多种数组方法来解决。

以下解决方案使用 concat、reduce 和 includes。

function arrayDifference(arr1, arr2) {
  return arr1
    .concat(arr2)
    .filter(item => !arr1.includes(item) || !arr2.includes(item));
}

console.log(arrayDifference([1, 2, 5], [1, 2, 3, 4, 5, 4])) // [3, 4, 4]
console.log(arrayDifference([1, 2, 5, 4], [1, 2, 3, 4]))    // [5, 3]