JavaScript: если аргумент определен, функция ищет индекс того, где аргумент появляется в массиве - PullRequest
1 голос
/ 23 марта 2019

Я попытался решить проблему ниже с JS:

Определите функцию myLastIndexOf, которая принимает до трех аргументов:

  • массив
  • searchValue
  • startIdx (необязательно)

  1. myLastIndexOf должен возвращать последний индекс, при котором searchValue появляется в массиве.

  2. Если searchValue отсутствует в массиве, myLastIndexOf должен возвращать -1.

  3. Если определен startIdx, myLastIndexOf должен начать поиск seachValue по этому индексу, а затем переместиться к передней части массива в поисках значения.

Вот мой код:

function myLastIndexOf (array, searchValue, startIdx){
  if (startIdx !== undefined){
    for (i=startIdx; i>=0; i--){
      //console.log(array[i])
      if (array[i] === searchValue){
        return i
      }
    }
  }
  else if (startIdx === undefined){
    for (i=0; i<array.length; i++){
      console.log(array[i])
      if (array[i] === searchValue){
        return i
      }
    }
  }

}

console.log(myLastIndexOf(['gee', 'gee', 'gee', 'gee', 'baby', 'baby'], 'gee')); // => 3

Код должен возвращать 3, но вместо этого я получаю ноль. Что у меня не так в моем коде?

Ответы [ 3 ]

1 голос
/ 23 марта 2019

Там есть несколько вопросов:

  1. Вы дублируете логику, когда вам не нужно

  2. Вы возвращаетесь на первый матч вместо последний матч

  3. Вы не объявляете свои переменные, поэтому ваш код становится жертвой того, что я называю Ужас неявных глобалов .

  4. Вы не вернете -1, если не найдете совпадения

Вот обновление с комментариями:

function myLastIndexOf(array, searchValue, startIdx) {
  // If `startIdx` is undefined, use the end of the array
  if (startIdx === undefined) {
    startIdx = array.length - 1;
  }
  // Declare `i`
  var i;
  // Loop backward from `startIdx`
  for (i = startIdx; i >= 0; --i) {
    if (array[i] === searchValue) {
      // Stop the loop early
      break;
    }
  }
  return i; // Will be -1 if not found
}

console.log(myLastIndexOf(['gee', 'gee', 'gee', 'gee', 'baby', 'baby'], 'gee')); // => 3
console.log(myLastIndexOf(['gee', 'gee', 'gee', 'gee', 'baby', 'baby'], 'gee', 2)); // => 2, because of startIdx

Цикл может быть немного короче, но для новичка он менее понятен:

// Loop backward from `startIdx`
while (i >= 0 && array[i] !== searchValue) {
    --i;
}

function myLastIndexOf(array, searchValue, startIdx) {
  // If `startIdx` is undefined, use the end of the array
  if (startIdx === undefined) {
    startIdx = array.length - 1;
  }
  // Declare `i`
  var i = startIdx;
  // Loop backward from `startIdx`
  while (i >= 0 && array[i] !== searchValue) {
    --i;
  }
  return i; // Will be -1 if not found
}

console.log(myLastIndexOf(['gee', 'gee', 'gee', 'gee', 'baby', 'baby'], 'gee')); // => 3
console.log(myLastIndexOf(['gee', 'gee', 'gee', 'gee', 'baby', 'baby'], 'gee', 2)); // => 2, because of startIdx

Или с использованием функций ES2015 +:

function myLastIndexOf(array, searchValue, startIdx = array.length - 1) {
  let i;
  for (i = startIdx; i >= 0; --i) {
    if (array[i] === searchValue) {
      // Stop the loop early
      break;
    }
  }
  return i; // Will be -1 if not found
}

console.log(myLastIndexOf(['gee', 'gee', 'gee', 'gee', 'baby', 'baby'], 'gee')); // => 3
console.log(myLastIndexOf(['gee', 'gee', 'gee', 'gee', 'baby', 'baby'], 'gee', 2)); // => 2, because of startIdx

или с более короткой петлей:

function myLastIndexOf(array, searchValue, startIdx = array.length - 1) {
  let i = startIdx;
  while (i >= 0 && array[i] !== searchValue) {
    --i;
  }
  return i; // Will be -1 if not found
}

console.log(myLastIndexOf(['gee', 'gee', 'gee', 'gee', 'baby', 'baby'], 'gee')); // => 3
console.log(myLastIndexOf(['gee', 'gee', 'gee', 'gee', 'baby', 'baby'], 'gee', 2)); // => 2, because of startIdx
1 голос
/ 23 марта 2019

Ваш цикл начинается с i=0, он должен начинаться с i = array.length -1i должно уменьшаться, а не увеличиваться.

function myLastIndexOf (array, searchValue, startIdx){

  if (startIdx !== undefined){

    for (let i=startIdx; i>=0; i--){

      //console.log(array[i])

      if (array[i] === searchValue){
        return i
      }
    }
  }

  else if (startIdx === undefined){

    for (let i=array.length - 1; i>=0; i--){

      console.log(array[i])

      if (array[i] === searchValue){
        return i
      }
    }
  }
  return -1;

}




console.log(myLastIndexOf(['gee', 'gee', 'gee', 'gee', 'baby', 'baby'], 'gee'));
0 голосов
/ 23 марта 2019

Вы возвращаете значение при первом совпадении, где вы должны хранить индекс и возвращаться в конце.

function myLastIndexOf (array, searchValue, startIdx){
let index = -1;
if (startIdx !== undefined){
  for (i=startIdx; i>=0; i--){
    if (array[i] === searchValue){
      index = i
    }
  }
}

else if (startIdx === undefined){
  for (i=0; i<array.length; i++){
    if (array[i] === searchValue){
      index = i
    }
  }
}
 return index
}

console.log(myLastIndexOf(['gee', 'gee', 'gee', 'gee', 'baby', 'baby'], 'gee'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...