如何根据JavaScript中另一个数组的索引从数组中选择元素?

时间:2017-04-30 16:35:05

标签: javascript arrays

这有效,但我想知道是否有更好的方法按索引过滤:

a = [10,20,30,40]
b = [1,3]
a.filter((x,i) => b.includes(i))
// [20, 40]

3 个答案:

答案 0 :(得分:9)

另一种方式是b.map(aIndex => a[aIndex])。如果b短于a,这也可能更快。但是,如果b中的索引不属于a,则最终会出现undefined"漏洞"在阵列中。

修改

看一下Array.includes,看起来它将在 O(n)中运行未排序的数组。 如果我们说A = a.lengthB = 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']