【发布时间】:2018-06-22 06:20:48
【问题描述】:
假设我有一个包含以下值的数组 -
var arr = [true, true, false, false, false, true, false];
我正在寻找可以给我以下输出的逻辑 -
[0,1,5]
【问题讨论】:
-
您还应该在帖子中发布自己的努力。
标签: javascript arrays
假设我有一个包含以下值的数组 -
var arr = [true, true, false, false, false, true, false];
我正在寻找可以给我以下输出的逻辑 -
[0,1,5]
【问题讨论】:
标签: javascript arrays
您可以使用.reduce() 一次性完成此操作:
const arr = [true, true, false, false, false, true, false]
const indices = arr.reduce(
(out, bool, index) => bool ? out.concat(index) : out,
[]
)
console.log(indices)
您首先将一个空数组[] 作为initialValue 传递给.reduce(),然后使用ternary ? operator 来确定是否将.concat() 传递给index。
或者,您可以使用更新的.flatMap() 方法:
const arr = [true, true, false, false, false, true, false]
const indices = arr.flatMap((bool, index) => bool ? index : [])
console.log(indices)
如果您的浏览器还不支持它,您将收到Uncaught TypeError: arr.flatMap is not a function。在这种情况下,您可以使用我在 here 中的 polyfill 定义。
【讨论】:
您可以映射索引或虚假值-1,然后过滤所有不是-1 的索引。
var array = [true, true, false, false, false, true, false],
result = array
.map((b, i) => b ? i : -1)
.filter(i => i !== -1);
console.log(result);
【讨论】:
一个可能更优雅的解决方案是:
[...arr.keys()].filter(i => arr[i])
或者
[...arr.entries()].filter(([, v]) => v).map(([i]) => i)
【讨论】:
您可以简单地使用循环并检查您的 if 条件中的布尔值 true:
var arr = [true, true, false, false, false, true, false];
var indexArray = [];
arr.forEach((val, index) => {
if(val){
indexArray.push(index);
}
});
console.log(indexArray);
【讨论】:
试试这个
var arr = [true, true, false, false, false, true, false];
var indexArray = [];
arr.forEach(function(value, index) {
if (value) {
indexArray.push(index);
}
})
console.log(indexArray);
【讨论】:
基于逻辑本身而非 JS 范式的不同解决方案
let newArr = [];
for (let i = 0 ; i<indexArray.length;i++){
if (indexArray[i]) newArr.push(i)
}
【讨论】: