Изменение массива без мутации

Я пытаюсь решить проблему, которая заявляет удалить (удалить) наименьшее число в массиве без порядка элементов слева от самого маленького элемента, который будет изменен. Мой код -:

function removeSmallest(numbers){
    var x =  Math.min.apply(null,numbers);
    var y = numbers.indexOf(x);
    numbers.splice(y,1);
    return numbers;
}

Это строго указано в инструкциях, чтобы не мутировать исходный массив / список. Но я получаю сообщение об ошибке, указав, что у вас есть мутированный исходный массив / список. Как удалить ошибку?

javascript,arrays,

0

Ответов: 5


0

сначала создайте копию массива с помощью среза , затем функцию removeSmallest ( numbers ) { var x = Math . мин . apply ( null , numbers ); var y = числа . indexOf ( x ); возвратные номера . slice (). сплайсинг ( y , 1 ); }, что

Array.prototype

0

Давайте сосредоточимся на том, как избежать мутирования (надеюсь, вы не имеете в виду «удалить ошибку» как «сообщение об ошибке при подавлении» или что-то в этом роде)

Существуют разные методы, и большинство из них не мутируют массив, а возвращают новый массив. 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;
}

Конечно, они не равны, но оба не изменяют исходную переменную


0

Вы можете создать мелкую копию массива, чтобы избежать мутации.

const slicedArray = numbers.slice()
const result = slicedArray.splice(y,1);

0

Слушайте здесь не используйте SPLICE. Известны известные новички ошибок и эксперт, когда они используют взаимозаменяемые сплайсинг и срез, не сохраняя при этом эффектов.

SPLICE будет мутировать исходный массив, в то время как SLICE будет мелко копировать исходный массив и возвращать часть массива при заданных условиях.

Здесь Slice создаст новый массив

splice

и вы получите результат без изменения исходного массива.


0

Я не уверен, что такое конкретный контекст проблемы, но целью может быть научиться писать чистые преобразования данных, а не учиться копированию массивов. Если это так, использование 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]));

JavaScript, массивы,
Похожие вопросы