比较 2 个数组并找到独特的差异
compare 2 array and find unique differences
假设我们有两个数组
var firstArray = [{"id":1},{"id":3},{"id":5}]
var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]
var missingValues = [];
for(var i=0; i < firstArray.length; i++) {
for(var j=0; j < secondArray.length; j++) {
if(firstArray[i].id === secondArray[j].id) {
//do something if I have the same id
} else {
missingValues.push(secondArray[j].id); // it should have unique values
}
}
}
for(var i = 0; i < missingValues.length; i++) {
//compare first array and missigValues and remove the same elements
}
我想要以下结果。这意味着我需要比较两个数组并删除不在第二个数组中的所有对象,但我还需要保持相同的顺序
firstArray = [{"id":1},{"id":2},{"id":3},{"id":4]
有更好的方法吗?更明智的性能,因为这些数组内部可能包含大量 JSON 数据。
我想尽可能避免多重嵌套。
这是一个符合我理解的文字描述的答案,但与(当前)示例不符。可能不正确:
var firstArray = [{"id":1},{"id":3},{"id":5}]
var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]
var foundIn = function(list) {
var ids = list.reduce(function(ids, item) {ids[item.id] = 1; return ids;}, {});
return function(item) {return !!ids[item.id];};
};
var result = firstArray.filter(foundIn(secondArray)); //=> [{"id":1},{"id":3}]
如果你想从中创建一个完全可重用的函数,你可以添加
var onlyFoundIn = function(list1, list2) {return list1.filter(foundIn(list2));};
然后
onlyFoundIn(firstArray, secondArray); //=> [{"id":1},{"id":3}]
但目前还不清楚这是否真的符合您的要求。
您可以使用临时基元数组来防止缓慢的用户态嵌套循环:
var firstArray = [{"id":1},{"id":3},{"id":5}]
var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]
var temp=secondArray.map(function(o){return o.id;});
var common=firstArray.filter(function(a){
return temp.indexOf(a.id)!==-1;
});
JSON.stringify(common) // [{"id":1},{"id":3}]
此方法假定 id 是建立唯一性所依据的唯一重要值,但速度非常快。
如果 id 总是一个数字,否则你永远不会有有意义的情况(例如 {id:1} vs {id:"1"},您可以通过使用对象键来建立唯一性来使其更快:
var firstArray = [{"id":1},{"id":3},{"id":5}]
var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]
var temp={};
secondArray.forEach(function(o){temp[o.id]=1; });
var common=firstArray.filter(function(a){
return temp[a.id]; //note no nested operation at all!
});
JSON.stringify(common) // [{"id":1},{"id":3}]
假设我们有两个数组
var firstArray = [{"id":1},{"id":3},{"id":5}]
var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]
var missingValues = [];
for(var i=0; i < firstArray.length; i++) {
for(var j=0; j < secondArray.length; j++) {
if(firstArray[i].id === secondArray[j].id) {
//do something if I have the same id
} else {
missingValues.push(secondArray[j].id); // it should have unique values
}
}
}
for(var i = 0; i < missingValues.length; i++) {
//compare first array and missigValues and remove the same elements
}
我想要以下结果。这意味着我需要比较两个数组并删除不在第二个数组中的所有对象,但我还需要保持相同的顺序
firstArray = [{"id":1},{"id":2},{"id":3},{"id":4]
有更好的方法吗?更明智的性能,因为这些数组内部可能包含大量 JSON 数据。 我想尽可能避免多重嵌套。
这是一个符合我理解的文字描述的答案,但与(当前)示例不符。可能不正确:
var firstArray = [{"id":1},{"id":3},{"id":5}]
var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]
var foundIn = function(list) {
var ids = list.reduce(function(ids, item) {ids[item.id] = 1; return ids;}, {});
return function(item) {return !!ids[item.id];};
};
var result = firstArray.filter(foundIn(secondArray)); //=> [{"id":1},{"id":3}]
如果你想从中创建一个完全可重用的函数,你可以添加
var onlyFoundIn = function(list1, list2) {return list1.filter(foundIn(list2));};
然后
onlyFoundIn(firstArray, secondArray); //=> [{"id":1},{"id":3}]
但目前还不清楚这是否真的符合您的要求。
您可以使用临时基元数组来防止缓慢的用户态嵌套循环:
var firstArray = [{"id":1},{"id":3},{"id":5}]
var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]
var temp=secondArray.map(function(o){return o.id;});
var common=firstArray.filter(function(a){
return temp.indexOf(a.id)!==-1;
});
JSON.stringify(common) // [{"id":1},{"id":3}]
此方法假定 id 是建立唯一性所依据的唯一重要值,但速度非常快。
如果 id 总是一个数字,否则你永远不会有有意义的情况(例如 {id:1} vs {id:"1"},您可以通过使用对象键来建立唯一性来使其更快:
var firstArray = [{"id":1},{"id":3},{"id":5}]
var secondArray = [{"id":1},{"id":2},{"id":3},{"id":4}]
var temp={};
secondArray.forEach(function(o){temp[o.id]=1; });
var common=firstArray.filter(function(a){
return temp[a.id]; //note no nested operation at all!
});
JSON.stringify(common) // [{"id":1},{"id":3}]