сначала создайте копию массива с помощью среза , затем функцию removeSmallest ( numbers ) { var x = Math . мин . apply ( null , numbers ); var y = числа . indexOf ( x ); возвратные номера . slice (). сплайсинг ( y , 1 ); }, что
Array.prototype
Я пытаюсь решить проблему, которая заявляет удалить (удалить) наименьшее число в массиве без порядка элементов слева от самого маленького элемента, который будет изменен. Мой код -:
function removeSmallest(numbers){
var x = Math.min.apply(null,numbers);
var y = numbers.indexOf(x);
numbers.splice(y,1);
return numbers;
}
Это строго указано в инструкциях, чтобы не мутировать исходный массив / список. Но я получаю сообщение об ошибке, указав, что у вас есть мутированный исходный массив / список. Как удалить ошибку?
Давайте сосредоточимся на том, как избежать мутирования (надеюсь, вы не имеете в виду «удалить ошибку» как «сообщение об ошибке при подавлении» или что-то в этом роде)
Существуют разные методы, и большинство из них не мутируют массив, а возвращают новый массив. say .map, .slice, .filter, .reduce let newArray = oldArray.filter(el => el !== minimalElementValue);
Говоря правду, всего несколько мутаций (например .splice)
Так что в зависимости от каких дополнительных требований вы можете найти .map полезно
let newArray = oldArray.map(el => el === minimalElementValue? undefined: el);
или .map
function removeSmallest(numbers){
const newNumbers = [...numbers];
var x = Math.min.apply(null,newNumbers);
var y = newNumbers.indexOf(x);
newNumbers.splice(y,1);
return newNumbers;
}
Конечно, они не равны, но оба не изменяют исходную переменную
Слушайте здесь не используйте SPLICE. Известны известные новички ошибок и эксперт, когда они используют взаимозаменяемые сплайсинг и срез, не сохраняя при этом эффектов.
SPLICE будет мутировать исходный массив, в то время как SLICE будет мелко копировать исходный массив и возвращать часть массива при заданных условиях.
Здесь Slice создаст новый массив
splice
и вы получите результат без изменения исходного массива.
Я не уверен, что такое конкретный контекст проблемы, но целью может быть научиться писать чистые преобразования данных, а не учиться копированию массивов. Если это так, использование splice
после создания избыточной копии массива может не сократить его.
Подход, который не мутирует ни исходный массив, ни его копия, может выглядеть так: определить индекс минимального элемента массива, а затем вернуть конкатенацию двух подписок вправо и влево от этой точки:
const minIndex = arr =>
arr.reduce(
(p, c, i) => (p === undefined ? i : c < arr[p] ? i : p),
undefined
);
const removeMin = arr => {
const i = minIndex(arr);
return minIndex === undefined
? arr
: [...arr.slice(0, i), ...arr.slice(i + 1)];
};
console.log(removeMin([1, 5, 6, 0, 11]));