从 Javascript 中的两个数组数组中根据条件获取一组数组
Get some set of array based on condition from two arrays of array in Javascript
我在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
的每个数组的第一个元素匹配的数组集
在我的示例中,array1
和 array2
都有第一个元素为 10
11
和 12
的数组,所以它应该 return
[[10, 2], [11, 4], [12, 30]];
有没有简单有效的方法使用纯 javscript 或 lodash、underscor 框架或类似的东西。无需迭代并逐一匹配这两个数组?
您可以使用 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)
如果你可以使用 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
条目的对象,以使用 in
、hasOwnProperty
或仅对象访问来测试是否存在:
var haystack = array2.reduce((obj, x) => (obj[x[0]] = true, obj), {});
var newArray = array1.filter(x => haystack[x[0]]);
哪一个性能更好取决于您拥有的元素数量和代码所在的环境 运行。
在 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);
以对象作为散列的版本table
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);
您可以使用 lodash _.intersectWith 函数以内联方式解决此问题。
_.intersectionWith(array1, array2, function(a, b) {
return a[0] === b[0];
});
我不知道性能,因为我还没有机会看这个函数的源代码。无论如何,我喜欢它的简单性。这是 fiddle 以备不时之需。
我会在 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);
如果您需要向后兼容,其他答案也不错。
我在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
在我的示例中,array1
和 array2
都有第一个元素为 10
11
和 12
的数组,所以它应该 return
[[10, 2], [11, 4], [12, 30]];
有没有简单有效的方法使用纯 javscript 或 lodash、underscor 框架或类似的东西。无需迭代并逐一匹配这两个数组?
您可以使用 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)
如果你可以使用 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
条目的对象,以使用in
、hasOwnProperty
或仅对象访问来测试是否存在:var haystack = array2.reduce((obj, x) => (obj[x[0]] = true, obj), {}); var newArray = array1.filter(x => haystack[x[0]]);
哪一个性能更好取决于您拥有的元素数量和代码所在的环境 运行。
在 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);
以对象作为散列的版本table
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);
您可以使用 lodash _.intersectWith 函数以内联方式解决此问题。
_.intersectionWith(array1, array2, function(a, b) {
return a[0] === b[0];
});
我不知道性能,因为我还没有机会看这个函数的源代码。无论如何,我喜欢它的简单性。这是 fiddle 以备不时之需。
我会在 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);
如果您需要向后兼容,其他答案也不错。