如何根据JavaScript中另一个数组的索引从数组中选择元素?
这是可行的,但我想知道是否有更好的方法按索引过滤:如何根据JavaScript中另一个数组的索引从数组中选择元素?,javascript,arrays,Javascript,Arrays,这是可行的,但我想知道是否有更好的方法按索引过滤: a = [10,20,30,40] b = [1,3] a.filter((x,i) => b.includes(i)) // [20, 40] 另一种方法是b.map(aIndex=>a[aIndex])。如果b比a短,这也可能更快。但是,如果b中存在不属于a的索引,则数组中会出现未定义的“洞” 编辑 查看数组。includes,对于未排序的数组,它看起来将以O(n)运行。 如果我们说A=A.length和B=B.length,你对这
a = [10,20,30,40]
b = [1,3]
a.filter((x,i) => b.includes(i))
// [20, 40]
另一种方法是
b.map(aIndex=>a[aIndex])
。如果b
比a
短,这也可能更快。但是,如果b
中存在不属于a
的索引,则数组中会出现未定义的“洞”
编辑
查看数组。includes
,对于未排序的数组,它看起来将以O(n)运行。
如果我们说A=A.length
和B=B.length
,你对这个问题的解答应该是O(A*B)。
第二个解决方案(带有map)将在O(B)中运行。要修复未定义的
漏洞,您可以添加一个过滤器(element=>typeof element!==“undefined”)
。
最后的解决方案是b.map(i=>a[i]).filter(e=>typeof e!==“undefined”)
。现在它在O(2*B)中运行,这应该仍然比O(A*B)更好。我认为您的解决方案非常好<代码>地图
也是一个很好的解决方案
对于记录,您可以使用一个For…of循环,但它会变得更加复杂,而不必付出任何代价
a=[10,20,30,40],
b=[1,3];
设res=[];
for(a.entries()的常量条目){
如果(b.包括(条目[0])){
res.push(条目[1]);
}
}
控制台日志(res)代码>这(以及更多)可以通过Lodash的功能完成:
_.at([10, 20, 30, 40], [1, 3]) // [20, 40]
_.at(['a', 'b'], [0, 1, 1, 0]) // ['a', 'b', 'b', 'a']
@Redu,这只适用于顺序Chunkstory,我的代码有一个错误。我已经更新了问题。您已经更改了问题,因此现在您必须执行b.map(I=>a[I])
假设b
始终在a
中的某个项目上进行索引映射。Redu明白了。是的,这比我做的要好。我想可能会有类似于a.select(b)