此JavaScript代码尝试在新数组中获取给定值5的索引。知道如何以优雅的方式做到这一点。我冷使用循环,但我希望使用map或reduce。谢谢。
console.log( [1, 2, 3, 5, 6, 5].map((y, i) => {
if (y === 5) return i
}))
// gives --> [undefined, undefined, undefined, 3, undefined, 5]
// expected [3,5]
答案 0 :(得分:2)
不幸的是map
和reduce
在JavaScript中没有延迟评估(即它们不是生成器/迭代器),但是如果你不介意双数组分配,那么你可以做到这一点:
var indices = [ 1, 2, 3, 5, 6, 5 ]
.map( ( e, i ) => e == 5 ? i : -1 )
.filter( e => e > -1 );
// indicies == [3,5]
另一种方法,更便宜:
var indices = [];
[ 1, 2, 3, 5, 6, 5 ].forEach( (e, i) => e == 5 ? indices.push( i ) : null );
这利用了您可以在void
三元运算符中使用?:
表达式的事实。
答案 1 :(得分:2)
您可以使用reduce
。回调的第三个参数是索引。
[1, 2, 3, 5, 6, 5].reduce((indexes, n, index) => {
if (n === 5) indexes.push(index)
return indexes
}, [])
答案 2 :(得分:2)
您可以使用map()
或reduce()
。
reduce()
将能够在一个循环中完成:
[1,2,3,4,5].reduce((result, num, index) => result.concat(num === 5 ? index : []), []);
使用concat()
代替push()
稍微慢一点,但更清晰,并且在相当小的集合中,差异可以忽略不计。
map()
需要filter()
才能删除其他内容:
[1,2,3,4,5].map((num, index) => num === 5 && index)
.filter(e => e !== false);
.filter(Boolean)
是一种干净,简洁的方法,可以将任何值转换为布尔值,然后该过滤器将用于确定它需要执行的操作。 num === 5 && index
将是false
或索引。另一种干净的方式。
答案 3 :(得分:1)
您可以在阵列上使用 reduce 运算符:
[1,2,3,5,6,5].reduce(function(a, e, i) {
if (e === 5)
a.push(i);
return a;
}, []);
答案 4 :(得分:1)
您可以运行一个映射来测试该值并写入null(不匹配)或位置(匹配),然后使用过滤器删除空值。
地图看起来像这样:
map( (value, index) => {
return value === 5 ? index : null;
})
然后你会像这样过滤它:
filter( (value) => {
return value != null;
})
答案 5 :(得分:1)
console.log( [1, 2, 3, 5, 6, 5].map((y, i) => {
if (y === 5) return i
}).filter((x) => {return /\d/.test(x);}));