表格中有2个数组:
array1 = [{key1: value1}, {key1: value2}, ...];
array2 = [{key2: value0}, {key2: value2}, ...];
其中两个数组中的对象键不同,但值可能匹配。我想编写一些代码来获取两个数组之间的交集,在上面的例子中,它应该返回:[value2]
。
我尝试使用:
array1.filter(function(n)) {
return array2.indexOf(n) != -1;
});
但当然我得到一个空数组,因为键不匹配。可以修改上面的代码以忽略对象键并仅匹配它们的值吗?
答案 0 :(得分:2)
var kiran = [];
var array1 = [{ key1: 'value1' }, { key1: 'value2' }];
var array2 = [{ key2: 'value0' }, { key2: 'value2' }];
array1.map(function(item1){
array2.map(function(item2){
if(item1.key1 === item2.key2){
kiran.push(item2.key2);
}
})
})
console.log(kiran);
答案 1 :(得分:1)
下面的方法怎么样
const array1 = [{ key1: 'value1' }, { key1: 'value2' }];
const array2 = [{ key2: 'value0' }, { key2: 'value2' }];
const result = array1.filter(c => array2.findIndex(x=>x.key2 == c.key1) > -1)
console.log(result);
答案 2 :(得分:0)
您可以使用哈希表和二进制值。然后检查计数是否等于3,然后取得该键作为结果。
var array1 = [{ key1: 'value1' }, { key1: 'value2' }],
array2 = [{ key2: 'value0' }, { key2: 'value2' }],
hash = Object.create(null),
incHash = function (i) {
return function (o) {
Object.keys(o).forEach(function (k) {
hash[o[k]] = (hash[o[k]] || 0) | 1 << i;
});
};
},
result;
[array1, array2].forEach(function (a, i) {
a.forEach(incHash(i));
});
result = Object.keys(hash).filter(function (k) {
return hash[k] === 3;
});
console.log(result);
console.log(hash);
答案 3 :(得分:0)
如果您可以使用第三方库,那么我建议 Lodash 。一个非常有用的实用程序库。
您可以使用_.intersectionWith()功能在一行中完成任务
var array1 = [{ key1: 'value1' }, { key1: 'value2' }],
array2 = [{ key2: 'value0' }, { key2: 'value2' }];
var intersection = _.map(_.intersectionWith(array1, array2, function(item1,item2){
return item1.key1 === item2.key2;
}),'key1');
console.log(intersection);
&#13;
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js">
</script>
&#13;