Получение индекса значения, имеющего несколько позиций в массиве - PullRequest
0 голосов
/ 17 февраля 2019

Добрый день, в настоящее время я ищу способ найти все индексы значения в любом массиве.Это значение может появляться более одного раза в этом массиве.Я мог бы использовать .includes и .indexOf, чтобы найти только первую позицию, что-то вроде

function indexOfValue(needle, hayStack) {
    if(hayStack.includes(needle)) {
        return hayStack.indexOf(needle);
    }
}
console.log(indexOfValue(12, [12, 1, 3, 3, 6, 12]));

Но это log value только первой позиции иглы.

Это то, что я пытался получить все index

function indexOfValue(needle, hayStack) {
    let result = [];
    for(let i = 0; i < hayStack.length; i++) {
        if (hayStack.includes(needle)) {
            return result.push(hayStack[i]);
        }
        return result;
    }
}
console.log(indexOfValue(12, [12, 1, 3, 3, 6, 12]));

Но приведенный выше код по какой-то причине возвращает 1 вместо [0,5].Пожалуйста, в чем проблема с этим конкретным кодом и как мне его исправить?

Ответы [ 5 ]

0 голосов
/ 17 февраля 2019

const numbers = [11, 3, 6, 8, 11];

const indexOfValue = (val,numbers) =>{
  let filtered =[];
  numbers.filter((number,index) => {   
    if(val === number)
       filtered = [...filtered,index];
  })
  return filtered;
}
console.log(indexOfValue(11,numbers));
0 голосов
/ 17 февраля 2019

Оба примера кода на вопрос return s в цикле for.Во втором примере .push() представляет элемент массива result, а не index.

Вы можете использовать второй параметр .indexOf(), чтобы установить индекс, с которого начинается поиск, проверьте, является ли результат .indexOf() больше -1 и индекс не находится в массиве result,return result массив после for loop

function indexOfValue(needle, hayStack) {
    let result = [];
    for(let i = 0; i < hayStack.length; i++) {
        let index = hayStack.indexOf(needle, i);
        if (index > -1 && result.indexOf(index) === -1) {
           result.push(index);
        }       
    }
    return result;
}
console.log(indexOfValue(12, [12, 1, 3, 3, 6, 12]));
0 голосов
/ 17 февраля 2019

Зацикливание всего массива и создание массива для индексов числа.Как ниже

function indexOfValue(num,arr){
  let indexes = [];
  for(let i = 0;i<arr.length;i++){
    //checks if the element at index 'i' is "num" then push index 'i' into indexes array
    if(arr[i] === num) indexes.push(i);
  }
  return indexes;
}

console.log(indexOfValue(12, [12, 1, 3, 3, 6, 12]))
0 голосов
/ 17 февраля 2019

Проблема с вашим кодом в том, что вы возвращаетесь слишком рано.

Каждый раз, когда вы return из функции, вы выходите из функции, мешая остальной части кода выполняться / выполняться внутри нее.

Итак, поскольку вы return входите в цикл for, вы останавливаете цикл от любых других проверок.Это означает, что вы должны вернуться после того, как ваш цикл полностью завершен.

Более того, вам также необходимо исправить оператор if в цикле for.В данный момент вы проверяете, содержит ли передаваемый вами массив (hayStack) искомый элемент (needle).Вместо этого вам нужно проверить, является ли текущий элемент (используя haystack[i]) needle, тогда, если это так, вам нужно вставить i (который является текущим индексом) в ваш массив result.

См. Рабочий пример ниже:

function indexOfValue(needle, hayStack) {
    let result = [];
    for(let i = 0; i < hayStack.length; i++) { // loop through the array, where `i` is the current index in the array
        if (hayStack[i] === needle) { // check if a given number inthe array is the `needle`, if it is:
            result.push(i); // add the index of the item to the result array
        }
    }
    return result; // only once the loop is complete return the array
}
console.log(indexOfValue(12, [12, 1, 3, 3, 6, 12]));

При желании вы также можете выполнить ту же задачу, используя функции высокого порядка, такие как reduce:

const indexOfValue = (n, arr, i) =>
  arr.reduce((acc, num, i) => num === n ? [...acc, i] : acc, [])

console.log(indexOfValue(12, [12, 1, 3, 3, 6, 12]));
0 голосов
/ 17 февраля 2019

Возвращение result.push сокращает вашу итерацию и даже не включает индекс.Вместо этого проверьте, равен ли каждый элемент игле, а затем нажмите индекс, если он равен.

function indexOfValue(needle, hayStack) {
    let result = [];
    for(let i = 0; i < hayStack.length; i++) {
        if (hayStack[i] === needle) { // check if matching
            result.push(i); //push the index
        }
    } return result; //return result at end
}
console.log(indexOfValue(12, [12, 1, 3, 3, 6, 12]))
...