2个对象数组的值的交点

时间:2017-01-26 15:23:58

标签: javascript arrays

表格中有2个数组:

array1 = [{key1: value1}, {key1: value2}, ...];
array2 = [{key2: value0}, {key2: value2}, ...];

其中两个数组中的对象键不同,但值可能匹配。我想编写一些代码来获取两个数组之间的交集,在上面的例子中,它应该返回:[value2]

我尝试使用:

array1.filter(function(n)) {
    return array2.indexOf(n) != -1;
});

但当然我得到一个空数组,因为键不匹配。可以修改上面的代码以忽略对象键并仅匹配它们的值吗?

4 个答案:

答案 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()功能在一行中完成任务

&#13;
&#13;
        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;
&#13;
&#13;