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.