我有两个数组。
array1 = [
{'id':1},
{'id': 2}
]
和
array2 = [
{'idVal':1},
{'idVal': 2},
{'idVal': 3},
{'idVal': 4}
]
我需要一种最佳方式,如果可能的话,我可以比较这两个数组,并获得一个结果数组,其中array2
而不是array1
中存在对象。两个数组中的键具有不同的名称。结果将是,
res = [
{'idVal': 3},
{'idVal': 4}
]
答案 0 :(得分:5)
使用_.differenceWith()
和比较器方法。根据关于_.difference()
的文档(差异基于差异):
创建一个未包含在另一个给定的数组值中的数组 使用SameValueZero进行相等比较的数组。订单和 结果值的引用由第一个数组确定。
所以array2
应该是传递给方法的第一个参数。
var array1 = [
{'id': 1},
{'id': 2}
];
var array2 = [
{'idVal': 1},
{'idVal': 2},
{'idVal': 3},
{'idVal': 4}
];
var result = _.differenceWith(array2, array1, function(arrVal, othVal) {
return arrVal.idVal === othVal.id;
});
console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
答案 1 :(得分:1)
使用ES6
const result = array2.filter(item => !array1.find(i => i.idVal === item.id))
答案 2 :(得分:0)
var array1 = [
{'id':1},
{'id': 2},
{'id': 3},
{'id': 4}
]
var array2 = [
{'id':1},
{'id': 3},
{'id': 4}
]
notInArray2 = array1.reduce( function(acc, v) {
if(!array2.find(function (vInner) {
return v.id === vInner.id;
})){
acc.push(v);
}
return acc
}, []);
console.log(JSON.stringify(notInArray2))
&#13;
答案 3 :(得分:0)
这是一个优化的解决方案,但不是使用lodash。我创建了一个仅包含array1
值的搜索索引,以便您可以在O(1)中查找元素,而不是浏览array1
中每个元素的整个array2
。
让m
的大小为array1
,n
的大小为array2
。此解决方案将在O(m+n)
中运行,而不是您之前没有事先编制索引的O(m*n)
。
const array1 = [
{'id':1},
{'id': 2}
];
const array2 = [
{'idVal':1},
{'idVal': 2},
{'idVal': 3},
{'idVal': 4}
];
const array1ValuesIndex = {};
array1.forEach(entry => array1ValuesIndex[entry.id] = true);
const result = array2.filter(entry => !array1ValuesIndex[entry.idVal]);
console.log(result);
&#13;
答案 4 :(得分:0)
array1 = [
{'id':1},
{'id': 2}
]
array2 = [
{'idVal':1},
{'idVal': 2},
{'idVal': 3},
{'idVal': 4}
]
var array1Keys=array1.map(function(d1){ return d1.id});
var result =array2.filter(function(d){ return array1Keys.indexOf(d.idVal)==-1 })
console.log(result);