从Javascript中的两个数组数组中获取一些基于条件的数组

时间:2016-10-05 16:52:23

标签: javascript arrays underscore.js lodash

我在Javascript中有两个数组数组,如

var array1 = [[10, 2], [11, 4], [12, 30], [13, 17], [14, 28]];
var array2 = [[8, 13], [9, 19], [10, 6], [11, 7], [12, 1]];

我想从array1获取与array2

的每个数组的第一个元素匹配的数组

在我的示例中,array1array2都包含第一个元素为10 1112的数组,因此它应返回

[[10, 2], [11, 4], [12, 30]];

有没有任何简单有效的方法使用纯javscript或lodash,undercor框架或类似的东西。没有迭代并且逐个匹配这两个数组?

5 个答案:

答案 0 :(得分:4)

在ES6中,您可以使用Set



var array1 = [[10, 2], [11, 4], [12, 30], [13, 17], [14, 28]],
    array2 = [[8, 13], [9, 19], [10, 6], [11, 7], [12, 1]],
    set = new Set(array2.map(a => a[0])),
    result = array1.filter(a => set.has(a[0]));

console.log(result);




将对象作为哈希表的版本



var array1 = [[10, 2], [11, 4], [12, 30], [13, 17], [14, 28]],
    array2 = [[8, 13], [9, 19], [10, 6], [11, 7], [12, 1]],
    result = array1.filter(function (a) {
        return this[a[0]];
    }, array2.reduce(function (r, a) { 
        r[a[0]] = true;
        return r;
    }, Object.create(null)));

console.log(result);




答案 1 :(得分:3)

您可以使用lodash _.intersectWith函数来解决内联中的此问题。

_.intersectionWith(array1, array2, function(a, b) {
    return a[0] === b[0];
});

我不知道性能因为我还没有机会看一下这个函数的源代码。无论如何,我喜欢它的简单。如果您要查看它,请fiddle

答案 2 :(得分:2)

如果您可以使用Set,那么您可以先计算要查找的一组数字,然后使用.filter仅获取其第一个元素位于该集合中的数组:

var haystack = new Set(array2.map(x => x[0]));
var newArray = array1.filter(x => haystack.has(x[0]));

当然,您也可以使用.map.filter的lodash或下划线版本。

使用Set的替代方法是:

  • 改为创建一个数组,并使用indexOf来测试是否存在。这将与元素数量成线性比例:

    var haystack = array2.map(x => x[0]);
    var newArray = array1.filter(x => haystack.indexOf(x[0]) > -1);
    
  • 使用number -> true条目创建一个对象,以使用inhasOwnProperty或仅对象访问来测试存在:

    var haystack = array2.reduce((obj, x) => (obj[x[0]] = true, obj), {});
    var newArray = array1.filter(x => haystack[x[0]]);
    

哪一个表现更好取决于您拥有的元素数量和运行代码的环境。

答案 3 :(得分:1)

您可以使用filter()find()

执行此操作



var array1 = [
  [10, 2],
  [11, 4],
  [12, 30],
  [13, 17],
  [14, 28]
];
var array2 = [
  [8, 13],
  [9, 19],
  [10, 6],
  [11, 7],
  [12, 1]
];

var result = array1.filter(function(ar) {
  return array2.find(function(e) {
    return e[0] == ar[0]
  })
})

console.log(result)




答案 4 :(得分:0)

我会在ES6中使用Map anf filter组合执行此操作,如下所示;



var array1 = [[10, 2], [11, 4], [12, 30], [13, 17], [14, 28]],
    array2 = [[8, 13], [9, 19], [10, 6], [11, 7], [12, 1]],
         m = new Map(array2),
    array3 = array1.filter(a => m.has(a[0]));
console.log(array3);




如果您需要向后兼容性,其他答案也相当不错。