我有两个数组,可以是整数数组,字符串数组甚至是对象数组,为了演示目的,我将使用整数数组。
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指令方法显示这两个数组的并排视图。那会有用吗?
答案 0 :(得分:2)
如果rightIndex
和leftIndex
的差值小于零,我建议使用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;
答案 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.values
和forEach
以及