Как назначить новый массив значений старому массиву внутри метода?

#javascript #arrays #filter #slice

#javascript #массивы #Фильтр #срез

Вопрос:

Существует множество методов майнинга со стандартными filter , map и так далее для возврата нового массива.

 let array = [1, 2, 3, 4];
array = someFilter(array);
array = otherFilter(array);
array = someMap(array);
  

Как я могу это сделать, не возвращая новый массив?

 let array = [1, 2, 3, 4];
someFilter(array);
otherFilter(array);
someMap(array);
  

Например

 let x = [1, 2, 3, 4];
filter(x);
// x still 1, 2, 3, 4

function filter(array){
    let newArray = array.filter((item) => item % 2 == 0);
    array = newArray; // what do here?
}
  

Обновить

Есть мое решение

 function replace(oldArray, newArray){
    oldArray.length = 0;
    push(oldArray, newArray);
}

function push(sourceArray, ...additionalArray) {
    additionalArray.forEach((array) => {
        if (array.length < 1000){
            sourceArray.push.apply(sourceArray, array);
        } else {
            array.forEach((item) => sourceArray.push(item));
        }
    });
    return sourceArray;
}
  

Ответ №1:

Используйте Array.splice() для удаления всех элементов из исходного массива и добавления элементов из нового массива:

 function filter(array) {
  const newArray = array.filter((item) => item % 2 == 0);
  array.splice(0, array.length, ...newArray);
}

const x = [1, 2, 3, 4];

filter(x);

console.log(x)  

Вы также устанавливаете длину массива равной 0, чтобы удалить все элементы, а затем нажимаете новые элементы:

 function filter(array) {
  const newArray = array.filter((item) => item % 2 == 0);
  array.length = 0;
  array.push(...newArray);
}

const x = [1, 2, 3, 4];

filter(x);

console.log(x)  

Комментарии:

1. Будет ли это работать со сложными элементами? Например, [ { key: { name: { first: 'first', last: 'last' } } }, ... ]

2. Таким образом исходный массив видоизменяется, непримитивные элементы не клонируются — ссылка на элемент копируется из одного массива в другой.

3. Да, этого достаточно the reference to the item is moved from one array to another . Я был смущен тем, что элементы удаляются.

4. Если у array есть много элементов (1000, 5000), есть ли проблема с ...newArray операцией?

5. Оператор spread небезопасен для стека, что означает, что он может вызвать переполнение стека, если элементов слишком много. Я без проблем использовал spread с массивами размером около 70-80 КБ. Если вы собираетесь работать с массивами такого размера, я предлагаю использовать 2-е решение, избегая разброса и перемещая элементы с помощью простого цикла.