简体   繁体   中英

Javascript - Get indices of true values in a boolean array

Let's say I have an array with the following values -

var arr = [true, true, false, false, false, true, false];

I'm looking for logic which will give me the following output -

[0,1,5]

You can use .reduce() to do this in one pass:

 const arr = [true, true, false, false, false, true, false] const indices = arr.reduce( (out, bool, index) => bool ? out.concat(index) : out, [] ) console.log(indices)

You start by passing an empty array [] as the initialValue to .reduce() and use a ternary ? operator to determine whether to .concat() the index or not.


Alternatively, you can use the more recent .flatMap() method:

 const arr = [true, true, false, false, false, true, false] const indices = arr.flatMap((bool, index) => bool ? index : []) console.log(indices)

If your browser does not yet support it, you'll get an Uncaught TypeError: arr.flatMap is not a function . In that case, you can use my polyfill definition from here .

You could map the indices or for falsy values -1 and then filter all indices which are not -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);

A potentially more elegant solution is:

[...arr.keys()].filter(i => arr[i])

or alternatively

[...arr.entries()].filter(([, v]) => v).map(([i]) => i)

You can simply use a loop and check the boolean value true in your if condition:

 var arr = [true, true, false, false, false, true, false]; var indexArray = []; arr.forEach((val, index) => { if(val){ indexArray.push(index); } }); console.log(indexArray);

try this

 var arr = [true, true, false, false, false, true, false]; var indexArray = []; arr.forEach(function(value, index) { if (value) { indexArray.push(index); } }) console.log(indexArray);

Different solution based on logic itself and not JS paradigms

let newArr = [];
for (let i = 0 ; i<indexArray.length;i++){
    if (indexArray[i]) newArr.push(i)
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM