找到两个数组之间的对称差

时间:2019-05-10 19:54:54

标签: javascript array-difference

我需要找到元素中两个数组之间的任何差异,并将所述元素推到新数组中,然后最后返回。我已经通过搜索从该网站提取了一个功能,该功能的目的是计算元素在数组中出现的次数并返回它。首先,我将两个数组连接在一起,然后应用了此函数(对其进行了修改以尽可能地适应我的问题)。然后,我尝试将不同的元素(不会发生两次)推入新数组。我的代码当然行不通,并且对Javascript还是陌生的,所以请对我轻松一点。

下面是我尝试过的一些代码,没有通过任何测试:

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

  let tempArr = arr1.concat(arr2);

  function countInArray(array, what) {
    var count = 0;
    for (var i = 0; i < array.length; i++) {
        if (array[i] === what) {
            count++;
        }
    }
    if (countInArray(tempArr, tempArr[i]) < 2) {
      newArr.push(tempArr[i]);
    } 
}


  return newArr;
}

如果您提供任何代码,请尝试为我分解代码,以便我更好地理解和学习。

4 个答案:

答案 0 :(得分:1)

您可以服用Set

  

通过Set对象,您可以存储任何类型的唯一值,无论是原始值还是对象引用。

并从左侧和右侧返回差异。

function getSymDifference(a, b) {
    return getDifference(a, b).concat(getDifference(b, a));
}

function getDifference(a, b) {
    var setB = new Set(b);
    return a.filter(v => !setB.has(v));
}

console.log(getSymDifference(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"])); // ["pink wool"]
console.log(getSymDifference([1, "calf", 3, "piglet"], [7, "filly"])); // [1, "calf", 3, "piglet", 7, "filly"]
console.log(getSymDifference([], ["snuffleupagus", "cookie monster", "elmo"]));
console.log(getSymDifference([1, 2, 3, 5], [1, 2, 3, 4, 5]));

通过拼接数组以防止再次使用已经访问过或搜索过的项目的经典方法。

function getSymDifference(a, b) {
    var aa = a.slice(),
        bb = b.slice(),
        result = [],
        i, j;

    for (i = 0; i < aa.length; i++) {
        j = bb.indexOf(aa[i]);
        if (j === -1) {
            result.push(aa[i]);
        } else {
            bb.splice(j, 1);
        }
    }
    return result.concat(bb);
}

console.log(getSymDifference(["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"], ["diorite", "andesite", "grass", "dirt", "dead shrub"])); // ["pink wool"]
console.log(getSymDifference([1, "calf", 3, "piglet"], [7, "filly"])); // [1, "calf", 3, "piglet", 7, "filly"]
console.log(getSymDifference([], ["snuffleupagus", "cookie monster", "elmo"]));
console.log(getSymDifference([1, 2, 3, 5], [1, 2, 3, 4, 5]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

要获得预期结果,请使用以下选项,对代码进行少量更改

  1. 为countInArray返回 count (当前返回未定义)

function countInArray(array, what) { var count = 0; for (var i = 0; i < array.length; i++) { if (array[i] === what) { count++; } } return count }

  1. 删除在countInArray方法内部调用CountInArray
  2. 运行tempArr的循环以与tempArr的每个其他值进行比较

for (var j = 0; j < tempArr.length; j++) { if (countInArray(tempArr, tempArr[j]) < 2) { newArr.push(tempArr[j]); } }

工作代码:

function diffArray(arr1, arr2) {
  let tempArr = arr1.concat(arr2);
  let newArr = [];
  function countInArray(array, what) {
    var count = 0;
    for (var i = 0; i < array.length; i++) {
        if (array[i] === what) {
            count++;
        }
    }
    return count
}
  
    for (var j = 0; j < tempArr.length; j++) {
       if (countInArray(tempArr, tempArr[j]) < 2) {
         newArr.push(tempArr[j]);
       } 
    }


  return newArr;
}


let arr1 = ["diorite", "andesite", "grass", "dirt", "pink wool", "dead shrub"]
let arr2 = ["diorite", "andesite", "grass", "dirt", "dead shrub"]
console.log(diffArray(arr1, arr2))

let arr3 = [1, "calf", 3, "piglet"]
let arr4 =  [7, "filly"]
console.log(diffArray(arr3, arr4))

codepen-https://codepen.io/nagasai/pen/OYNdZX?editors=1010

答案 2 :(得分:0)

反转第二个数组,可能可以简化您的任务

Array.Reverse方法: http://www.w3schools.com/jsref/jsref_reverse.asp

答案 3 :(得分:0)

我可以找到的最优雅的解决方案显然是使用ES7。我将其发布在下面,但是如果有人可以帮助我弄清楚如何使我的初始代码正常工作,将不胜感激。

function diffArray(arr1, arr2) {

let difference = arr1
                 .filter(x => !arr2.includes(x))
                 .concat(arr2.filter(x => !arr1.includes(x)));


  return difference;
}

基本上,这将根据第二个数组没有的内容来过滤第一个数组,并根据第一个数组中没有的内容将其连接到过滤后的第二个数组上。因此,它得到了双方,而不仅是双方,因此是“对称的”。