#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-е решение, избегая разброса и перемещая элементы с помощью простого цикла.