javascript比较两个数组找到差异

时间:2016-07-01 20:15:51

标签: javascript arrays angularjs angularjs-directive compare

我有两个数组,可以是整数数组,字符串数组甚至是对象数组,为了演示目的,我将使用整数数组。

array1:        array2:
 0              99
 1              1             
 101            5
 2              100
 100            97  
 5              101   
 4              4  

我希望有一个函数返回数组包含有关两个数组之间差异的所有信息。 结果将是:

 0     --                 {match:false,leftIndex:0             }
 --    99                 {match:false:            rightIndex:0}
 1     1                  {match:true: leftIndex:1,rightIndex:1}
 --    5                  {match:false:            rightIndex:2}
 --    100                {match:false:            rightIndex:3}
 --    97                 {match:false:            rightIndex:4}
 101   101                {match:false:leftIndex:2,rightIndex:5}
 2     --                 {match:false:leftIndex:3             }
 100   --                 {match:false:leftIndex:4             }
 5     --                 {match:false:leftIndex:5             }
 4     4                  {match:false:leftIndex:6,rightIndex:6}

最好的方法是什么? 我打算使用此函数使用angularJS指令方法显示这两个数组的并排视图。那会有用吗?

2 个答案:

答案 0 :(得分:2)

如果rightIndexleftIndex的差值小于零,我建议使用Map作为键和索引作为匹配检查的值。

在这种情况下,会找到匹配的项目,如果缺少右侧的其他值,则会进行检查。

对于最后一部分,array2的可能剩余部分也被推迟了。

0   1   2   4   5  97  99 100 101   values
0   1   3   6   5   -   -   4   2   leftIndex
-   1   -   6   2   4   0   3   5   rightIndex
-   0   -   0  -3   -   -  -1   3   delta: p2 - p1
    *       *                   *   relevant only delta >= 0



var array1 = [0,     1,             101, 2, 100, 5, 4],
    array2 = [   99, 1, 5, 100, 97, 101,            4],
    map = new Map,
    j = 0,
    result = [];

array2.forEach(map.set.bind(map));

array1.forEach(function (a, i) {
    if (map.has(a) && map.get(a) >= i) {
        while (j < map.get(a)) {
            result.push({ value: array2[j], match: false, rightIndex: j });
            j++;
        }
        result.push({ value: a, match: true, leftIndex: i, rightIndex: j });
        j++;
        return;
    }
    result.push({ value: a, match: false, leftIndex: i });
});

while (j < array2.length) {
    result.push({ value: array2[j], match: false, rightIndex: j });
    j++;
}

console.log(result);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

如果您可以使用最新的ES6功能,我会选择以下内容:

function areArrayEqual(array1, array2) {
    // Based on http://stackoverflow.com/a/14853974/2586392
    if (array1.length !== array2.length) return false;

    for (var i = 0, l=array1.length; i < l; i++) {
      if (!areArrayEqual(array1[i], array2[i]) return false;       
      else if (array1[i] != array2[i]) return false;   
    }       

    return true;
})

var result = [];
array1.forEach((value, i) => {
  let j = array2.findIndex(x => {
    if (typeof value !== typeof x) return false;
    if (typeof value === 'object') return areArrayEquals(Object.values(x), Object.values(value));
    if (typeof value === 'array') return areArrayEquals(x, value);
    return x === value;
  });

  result.push([value, j === -1 ? '---' : value , {
    match: !!(j + 1),
    leftIndex: i,
    rightIndex: j === -1 ? '---' : j
  }]);

  if (j !== -1) {
    delete array2[j];
  }
});

array2.forEach((value, i) => {
  result.push(['---', value, {match: false, leftIndex: '---', rightIndex: i}]);
});

否则你仍然可以使用类似的东西,但你需要填充Object.valuesforEach以及