Действительно, если вы хотите, чтобы использовал findIndex
, тогда его возвращаемого значения никогда не будет достаточно, поскольку это только один индекс. Вы можете использовать «побочный эффект» и использовать другую переменную для хранения второго индекса. Чтобы найти второй индекс, не используйте снова findIndex
, так как это излишне. Используйте indexOf
и убедитесь, что он сканирует только часть массива, которая идет после первого индекса (с использованием второго аргумента indexOf
):
function twoSum(arr, target) {
let j = -1; // Needs to be accessible by the following function:
function added(val, i) {
// modify the variable outside of this function scope:
j = arr.indexOf(target - val, i + 1);
return j >= 0; // true if success
}
// findIndex will modify j, which we add to the pair
return [arr.findIndex(added), j]; // will be [-1, -1] when not found
}
console.log(twoSum([2, 7, 11, 15], 9)); // found
console.log(twoSum([2, 7, 11, 15], 100)); // not found
Функция added
теперь является «грязной» функцией, поскольку она изменяет переменную во внешней области видимости. Но это ближе всего к тому, что вы пытались сделать.
Требуется больше for
l oop (вместе с indexOf
). А для больших массивов вам будет полезно сначала создать карту, поэтому вам не нужен линейный поиск в пределах этого l oop, а только постоянный.