Какой метод перебора массивов JS использовать и как?
map/filter:arr.map((n, i) => n ? i : null).filter(n => n !== null)
// или
arr.map((n, i) => n ? i : NaN).filter(n => n === n)
// или
arr.map((n, i) => !!n && i).filter(Number.isInteger)
// или
arr.map((n, i) => !n || i).filter(n => n !== !0)
reduce:arr.reduce((acc, n, i) => n ? [ ...acc, i ] : acc, [])
// или
arr.reduce((acc, n, i) => (n && acc.push(i), acc), [])
или, если надо изменить текущий массив, а не создавать новыйfor (let i = arr.length; i--; ) {
  if (arr[i]) {
    arr[i] = i;
  } else {
    arr.splice(i, 1);
  }
}
// или
arr.reduceRight((_, n, i, a) => n ? a[i] = i : a.splice(i, 1), 0)
Самое нормальное решение — через reduce, он для этого и существует. Но там технически есть второй массив.arr.reduce((arr, n, i) => {
  if (n === 1) {
    arr.push(i);
  }

  return arr;
}, []);
Если использовать цепочку map + filter, там тоже, технически, используется промежуточный массив.
В чем смысл вашей задачи? Или это теоретическое упражнение?