check for mutations to original array/list

173
26 декабря 2018, 15:50

Решал различные задачки с помощью JavaScript'a. И споткнулся на такой: Цель, удалить минимальное значение из массива, при том, что расположение элементов не должно меняться, с задачей я вроде как справился, но сайт не пропускает, один тест не проходит. Пишет, что нужно проверять на мутированный массив.

function removeSmallest(numbers) { 
    var min, minindex; 
    min = numbers[0]; 
    minindex = 0; 
    for(var i = 0; i < numbers.length; i++) { 
      if(min > numbers[i]) { 
        min = numbers[i]; 
        minindex = i; 
      } 
    } 
    numbers.splice(minindex, 1) 
    return numbers; 
  }

Что я делаю не так и какую проверку я вообще должен сделать? Задачка с codewars

Answer 1

В аргумента вы получаете ссылку на массив который передался из теста, не копию массива. В коде Вы мутируете(изменяете) его через функцию splice. Решение в том чтобы сделать копию массива: numbers = [...numbersInput]. Или же можно воспользоваться решением которое не мутирует массив.

function removeSmallest (numbersInput) { 
  var numbers, min, minindex; 
  numbers = [...numbersInput]; // копия массива 
  min = numbers[0]; 
  minindex = 0; 
   
  for (var i = 0; i < numbers.length; i++) { 
    if (min > numbers[i]) { 
      min = numbers[i]; 
      minindex = i; 
    } 
  } 
  numbers.splice(minindex, 1) 
  return numbers; 
} 
 
console.log(removeSmallest([2, 50, 51, 60]))

Вот мой вариант решения и вариант как можно сделать по вашей идее но через findIndex:

console.log(removeSmallest([2, 50, 51, 60])) 
console.log(removeSmallest2([2, 50, 51, 60])) 
 
function removeSmallest (numbers) { 
  const min = Math.min(...numbers) // преобразвывает массив в аргументы 
   
  return numbers.filter(i => i !== min) // это не мутирует исходный массив, а возвращает модифицированый 
} 
 
function removeSmallest2 (numbersInput) { 
  let numbers = [...numbersInput] // копия массива 
  const min = Math.min(...numbers) 
  const minIndex = numbers.findIndex(i => i === min) 
   
  numbers.splice(minIndex, 1) 
   
  return numbers; 
}

READ ALSO
A* не может обойти препятствие (JS)

A* не может обойти препятствие (JS)

В текущей реализации функция находит правильный путь до препятствия, но когда она начинает обходить его f следующего шага в правильном направлении...

182
JSON для TreeTable в PRIME NG

JSON для TreeTable в PRIME NG

Как лучше сгенерить такой JSON?

183
Проблемы при использовании SCORM-курсов

Проблемы при использовании SCORM-курсов

Пытаюсь разобраться с курсами SCORM

187
Проблема с кодировкой виджета

Проблема с кодировкой виджета

Подскажите, почему может быть такая проблема с кодировкой при наведении и черные точки?

142