Как очистить массив в JavaScript.

javascript arrays


Есть ли способ очистить массив и, если возможно, с помощью .remove() ?

Например,

A = [1,2,3,4];

Как я могу опустошить это?




Answer 1 Philippe Leybaert


Способы очистки существующего массива A :

Способ 1

(это был мой оригинальный ответ на вопрос)

A = [];

Этот код установит переменную A в новый пустой массив. Это идеально, если у вас нет ссылок на исходный массив A где-либо еще, потому что это фактически создает новый (пустой) массив. Вы должны быть осторожны с этим методом, потому что, если вы ссылались на этот массив из другой переменной или свойства, исходный массив останется неизменным. Использовать это , если вы только ссылки на массив с помощью своей первоначальной переменной A .

Это также самое быстрое решение.

Данный пример кода показывает проблему,с которой можно столкнуться при использовании данного метода:

var arr1 = ['a','b','c','d','e','f'];
var arr2 = arr1;  // Reference arr1 by another variable 
arr1 = [];
console.log(arr2); // Output ['a','b','c','d','e','f']

Способ 2 (как предложено от Мэтью Крамли )

A.length = 0

Это очистит существующий массив,установив его длину в 0.Некоторые утверждают,что это может работать не во всех реализациях JavaScript,но получается,что это не так.Это также работает при использовании "строгого режима" в ECMAScript 5,поскольку свойство длины массива является свойством чтения/записи.

Способ 3 (как предложено от Anthony )

A.splice(0,A.length)

Использование .splice() будет отлично работать, но, поскольку .splice() вернет массив со всеми удаленными элементами, она фактически вернет копию исходного массива. Тесты показывают, что это никак не влияет на производительность.

Способ 4 (как предложено путем tanguy_k )

while(A.length > 0) {
    A.pop();
}

Данное решение не очень лаконично,а также является самым медленным решением,в отличие от предыдущих бенчмарков,на которые ссылались в оригинальном ответе.

Performance

Из всех методов очистки существующего массива методы 2 и 3 очень похожи по производительности и намного быстрее, чем метод 4. См. Этот тест .

Как указал Диадистис в своем ответе ниже, исходные критерии, которые использовались для определения эффективности четырех методов, описанных выше, были ошибочными. Исходный бенчмарк повторно использовал очищенный массив, поэтому вторая итерация очищала уже пустой массив.

Следующий бенчмарк исправляет этот недостаток: http://jsben.ch/#/hyj65 . Это ясно показывает, что методы # 2 (свойство length) и # 3 (соединение) являются самыми быстрыми (не считая метода # 1, который не изменяет исходный массив).


Это было горячей темой и причиной множества споров.На самом деле есть много правильных ответов,и поскольку этот ответ был отмечен как принятый ответ в течение очень долгого времени,я включу все методы здесь.Если вы проголосуете за этот ответ,пожалуйста,проголосуйте и за другие ответы,на которые я ссылался.




Answer 2 Matthew Crumley


Если вам нужно сохранить исходный массив,так как у вас есть другие ссылки на него,которые тоже нужно обновить,вы можете очистить его без создания нового массива,установив его длину равной нулю:

A.length = 0;



Answer 3 tanguy_k


Здесь самая быстрая рабочая реализация , сохраняя тот же массив («изменяемый»):

function clearArray(array) {
  while (array.length) {
    array.pop();
  }
}

К вашему сведению, его нельзя упростить до while (array.pop()) : тесты не пройдут.

FYI Map и Set определяют clear() , было бы логично иметь clear() для Array .

Версия TypeScript:

function clearArray<T>(array: T[]) {
  while (array.length) {
    array.pop();
  }
}

Соответствующие тесты:

describe('clearArray()', () => {
  test('clear regular array', () => {
    const array = [1, 2, 3, 4, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });

  test('clear array that contains undefined and null', () => {
    const array = [1, undefined, 3, null, 5];
    clearArray(array);
    expect(array.length).toEqual(0);
    expect(array[0]).toEqual(undefined);
    expect(array[4]).toEqual(undefined);
  });
});

Вот обновленный jsPerf: http://jsperf.com/array-destroy/32 http://jsperf.com/array-destroy/152




Answer 4 Anthony


Более кросс-браузерным и более оптимальным решением будет использование метода splice для очистки содержимого массива A, как показано ниже:

A.splice(0, A.length);




Answer 5 Bekim Bacaj


Ответы,которые имеют не менее 2739 upvotes на данный момент,вводят в заблуждение и неверны.

Вопрос в следующем: «Как очистить существующий массив?» Например, для A = [1,2,3,4] .

  1. Сказать, что « A = [] - это ответ», является неосведомленным и абсолютно неверным. [] == [] является ложным .

    Это происходит потому,что эти два массива-это два отдельных,отдельных объекта,со своими собственными двумя идентичностями,занимающих свое собственное пространство в цифровом мире,каждый из которых сам по себе.


Скажем,твоя мать просит тебя вынести мусорный бак.

  • Ты не приносишь нового,как будто сделал то,о чем тебя просили.
  • Вместо этого ты опустошаешь мусорный бак.
  • Вы не заменяете заполненную банку новой пустой банкой и не берете метку «A» из наполненной банки и приклеиваете ее к новой, как в A = [1,2,3,4]; A = [];

Опустошение объекта массива-самая простая вещь:

A.length = 0;

Таким образом,банка под буквой "А" не только пуста,но и чиста,как новая!


  1. Кроме того,Вы не обязаны вывозить мусор вручную,пока не опорожнится контейнер! Вас попросили опорожнить существующую,полностью,в одну очередь,не поднимать мусор,пока банка не опорожнится:

    while(A.length > 0) {
        A.pop();
    }
  2. Кроме того,чтобы положить левую руку в нижней части мусорной корзины,держа его с правой стороны в верхней,чтобы иметь возможность вытащить его содержание,как в:

    A.splice(0, A.length);

Нет,тебя попросили опустошить его:

A.length = 0;

Это единственный код,который корректно опустошает содержимое заданного массива JavaScript.