6

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]
2

6 Answers 6

12

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.

Sign up to request clarification or add additional context in comments.

Comments

5

A potentially more elegant solution is:

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

or alternatively

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

Comments

3

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);

Comments

0

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);

Comments

-1

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);

Comments

-1

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)
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.