这有效,但我想知道是否有更好的方法按索引过滤:
a = [10,20,30,40]
b = [1,3]
a.filter((x,i) => b.includes(i))
// [20, 40]
答案 0 :(得分:9)
另一种方式是b.map(aIndex => a[aIndex])
。如果b
短于a
,这也可能更快。但是,如果b
中的索引不属于a
,则最终会出现undefined
"漏洞"在阵列中。
修改强>
看一下Array.includes
,看起来它将在 O(n)中运行未排序的数组。
如果我们说A = a.length
和B = b.length
,那么问题的解决方案应该在 O(A * B)中运行。
第二个解决方案(带地图)将在 O(B)中运行。要修复undefined
个洞,您可以添加.filter(element => typeof element !== 'undefined')
。
最终的解决方案是b.map(i => a[i]).filter(e => typeof e !== 'undefined')
。这现在在 O(2 * B)中运行,它应该仍然优于 O(A * B)。
答案 1 :(得分:2)
我认为你的解决方案很棒。 map
也是一个很好的解决方案。
为了记录,您可以使用for...of
循环,但它变得更加复杂,没有任何东西......
let a = [10, 20, 30, 40],
b = [1, 3];
let res = [];
for (const entry of a.entries()) {
if (b.includes(entry[0])) {
res.push(entry[1]);
}
}
console.log(res);

答案 2 :(得分:1)
这个(以及更多)可以使用Lodash的at
功能完成:
_.at([10, 20, 30, 40], [1, 3]) // [20, 40]
_.at(['a', 'b'], [0, 1, 1, 0]) // ['a', 'b', 'b', 'a']