Есть ли способ очистить массив и, если возможно, с .remove()
?
Например,
A = [1,2,3,4];
Как я могу очистить это?
javascript
arrays
akano1
источник
источник
Ответы:
Способы очистки существующего массива
A
:Способ 1
(это был мой оригинальный ответ на вопрос)
Этот код установит переменную
A
в новый пустой массив. Это идеально, если у вас нет ссылок на исходный массивA
где-либо еще, потому что это фактически создает новый (пустой) массив. Вы должны быть осторожны с этим методом, потому что, если вы ссылались на этот массив из другой переменной или свойства, исходный массив останется неизменным. Используйте это только если вы ссылаетесь на массив только по его исходной переменнойA
.Это также самое быстрое решение.
Этот пример кода показывает проблему, с которой вы можете столкнуться при использовании этого метода:
Способ 2 (как предложено от Мэтью Крамли )
Это очистит существующий массив, установив его длину равным 0. Некоторые утверждают, что это может работать не во всех реализациях JavaScript, но оказывается, что это не так. Это также работает при использовании «строгого режима» в ECMAScript 5, поскольку свойство длины массива является свойством чтения / записи.
Способ 3 (как предложено от Anthony )
Использование
.splice()
будет работать отлично, но, поскольку.splice()
функция вернет массив со всеми удаленными элементами, она фактически вернет копию исходного массива. Тесты показывают, что это никак не влияет на производительность.Способ 4 (как предложено путем tanguy_k )
Это решение не очень кратко, и это также самое медленное решение, в отличие от более ранних тестов, на которые ссылались в исходном ответе.
Представление
Из всех методов очистки существующего массива методы 2 и 3 очень похожи по производительности и намного быстрее, чем метод 4. См. Этот тест .
Как указал Диадистис в своем ответе ниже, исходные критерии, которые использовались для определения эффективности четырех методов, описанных выше, были ошибочными. Исходный бенчмарк повторно использовал очищенный массив, поэтому вторая итерация очищала массив, который уже был пустым.
Следующий бенчмарк исправляет этот недостаток: http://jsben.ch/#/hyj65 . Это ясно показывает, что методы # 2 (свойство length) и # 3 (соединение) являются самыми быстрыми (не считая метода # 1, который не изменяет исходный массив).
Это была горячая тема и причина многих противоречий. На самом деле есть много правильных ответов, и поскольку этот ответ был помечен как принятый ответ в течение очень долгого времени, я включу все методы здесь. Если вы проголосуете за этот ответ, пожалуйста, подпишите другие ответы, на которые я также ссылался.
источник
while (A.length) { A.pop(); }
, не нужно> 0
> 0
ИМХО более читабельно. И нет никакой разницы в производительности между ними.b
содержит ссылку на старый массив даже послеa
назначения нового.c
иd
продолжать ссылаться на тот же массив. Таким образом, ожидается разница в результатах.while(A.pop())
в случае, если элемент в массиве ложный. Взять, к примеру, A = [2, 1, 0, -1, -2], в результате чего A будет равно [2, 1]. Дажеwhile(A.pop() !== undefined)
не работает, потому что вы можете иметь массив с неопределенным в качестве одного из значений. Вероятно, почему компилятор не оптимизировал его.Если вам нужно сохранить исходный массив, поскольку у вас есть другие ссылки на него, которые также должны быть обновлены, вы можете очистить его, не создавая новый массив, установив его длину в ноль:
источник
myarray.push(whatever)
он добавляет единицу к длине. Поэтому установка длины усекает массив, но он не является постоянным.length
это специальное свойство, но не только для чтения, поэтому оно все равно будет работать.Здесь самая быстрая рабочая реализация, сохраняя тот же массив («изменяемый»):К вашему сведению, это нельзя упростить
while (array.pop())
: тесты не пройдут.FYI Map и Set определяют
clear()
, что было бы логично иметьclear()
для Array тоже.Версия TypeScript:
Соответствующие тесты:
Вот обновленный jsPerf:
http://jsperf.com/array-destroy/32http://jsperf.com/array-destroy/152источник
Array.prototype
и делала что-то немного другое, тогда весь ваш код[].clear()
был немного неправильным. Это не было бы весело для отладки. Итак, общее сообщение: не модифицируйте глобальные переменные.function clear(arr) { while(arr.length) arr.pop(); }
затем очистите массивыclear(arr)
вместоarr.clear()
..splice()
и.length=0
. Тесты были неверны. Смотрите мой обновленный ответ.Более кросс-браузерным и более оптимальным решением будет использование
splice
метода для очистки содержимого массива A, как показано ниже:A.splice(0, A.length);
источник
splice
изменяет массив и возвращает удаленные записи. Сначала прочтите документы: developer.mozilla.org/en-US/docs/JavaScript/Reference/…A.splice(0, A.length),0;
. Это оставило бы возвращаемое значение так0
же, какA.length = 0;
и. Полученный массив все еще создается и должен заставить скрипт работать медленнее: ( jsperf ~ 56% медленнее). Реализация браузера повлияет на это, хотя я не вижу причин, почему этоsplice
было бы быстрее, чем настройкаlength
.A.splice(0)
также работает.Ответы, которые к настоящему времени имеют не менее 2739 голосов, вводят в заблуждение и неверны.
Вопрос в следующем: «Как очистить существующий массив?» Например, для
A = [1,2,3,4]
.Сказать «
A = []
это ответ» невежественно и абсолютно неверно.[] == []
является ложным .Это связано с тем, что эти два массива представляют собой два отдельных отдельных объекта со своими двумя идентичностями, занимающими свое собственное пространство в цифровом мире, каждый из которых сам по себе.
Допустим, твоя мама просит тебя очистить мусорное ведро.
A = [1,2,3,4]; A = [];
Очистка объекта массива - самая простая вещь:
Таким образом, банка под буквой «А» не только пуста, но и чиста, как новая!
Кроме того, вы не обязаны убирать мусор вручную, пока банка не опустеет! Вас попросили полностью опустошить существующую за один ход, чтобы не собирать мусор до тех пор, пока банка не опустеет, как в:
Кроме того, чтобы поместить левую руку в нижнюю часть корзины, удерживая ее правой стороной вверху, чтобы можно было извлечь ее содержимое, как показано ниже:
Нет, вас попросили очистить его:
Это единственный код, который корректно очищает содержимое данного массива JavaScript.
источник
A(n) = A.splice( 0, A.length );
в случае, если вам нужно сделать резервную копию вашего предыдущего контента. psArray.length
- это свойство \ метод чтения-записи, если вы пропустили этот базовый факт. Это означает, что вы можете расширить его до новой длины, вы не можете урезать его до любой длины, которую хотите, и, среди прочего, вы можете отказаться от всех членов, сократив его длину до 0. Это швейцарский нож массива.Тест производительности:
http://jsperf.com/array-clear-methods/3
источник
Вы можете добавить это в свой файл JavaScript, чтобы разрешить очистку ваших массивов:
Тогда вы можете использовать это так:
Или, если вы хотите быть уверенным, что вы ничего не разрушаете:
Многие люди думают, что вы не должны изменять нативные объекты (например, Array), и я склонен согласиться. Пожалуйста, будьте осторожны при решении, как справиться с этим.
источник
clear
ключ?Существует много путаницы и дезинформации в отношении времени, всплывающих / сдвиговых характеристик как в ответах, так и в комментариях. Решение while / pop имеет (как и ожидалось) худшую производительность . На самом деле происходит то, что установка запускается только один раз для каждого примера, который запускает фрагмент в цикле. например:
Я создал новый тест, который работает правильно:
http://jsperf.com/empty-javascript-array-redux
Предупреждение: даже в этой версии теста вы не увидите реальной разницы, потому что клонирование массива занимает большую часть времени тестирования. Это все еще показывает, что
splice
это самый быстрый способ очистки массива (не принимая[]
во внимание, потому что, хотя он самый быстрый, он фактически не очищает существующий массив).источник
Если вы заинтересованы в распределении памяти, вы можете сравнить каждый подход, используя что-то вроде этого jsfiddle в сочетании с вкладкой временной шкалы инструментов Chrome Dev. Вы захотите использовать значок корзины для мусора внизу, чтобы вызвать сборку мусора после «очистки» массива. Это должно дать вам более определенный ответ для браузера по вашему выбору. Многие ответы здесь старые, и я бы не стал на них полагаться, а скорее проверил, как в ответе @ tanguy_k выше.
(для ознакомления с вышеупомянутой вкладкой вы можете проверить здесь )
Stackoverflow заставляет меня скопировать jsfiddle, вот оно:
И вы должны принять к сведению, что это может зависеть от типа элементов массива, поскольку javascript управляет строками иначе, чем другие примитивные типы, не говоря уже о массивах объектов. Тип может влиять на то, что происходит.
источник
Вы можете легко создать функцию, которая сделает это за вас, изменить длину или даже добавить ее в собственный массив как
remove()
функцию для повторного использования.Представьте, что у вас есть этот массив:
ОК, просто запустите это:
и результат:
простой способ очистить массив ...
Также используется цикл, который не является необходимым, но просто еще один способ сделать это:
Есть также хитрый способ, о котором вы можете подумать, например, что-то вроде этого:
Таким образом, если arr имеет 5 элементов, он объединит 5 элементов из 0, что означает, что в массиве ничего не останется.
Также другие способы, такие как просто переназначить массив, например:
Если вы посмотрите на функции Array, есть много других способов сделать это, но наиболее рекомендуемым может быть изменение длины.
Как я уже сказал, вы также можете создать прототип remove (), так как это ответ на ваш вопрос. Вы можете просто выбрать один из методов выше и создать его прототип для объекта Array в JavaScript, например:
и вы можете просто вызвать его так, чтобы очистить любой массив в вашем приложении javascript:
источник
И назовите это:
array.clear();
источник
A.splice(0);
Я только что сделал это с кодом, над которым я работаю. Это очистило массив.
источник
Если вы используете
Затем вы присваиваете новую ссылку на массив для a, если ссылка в a уже назначена для любой другой переменной, тогда он также не будет очищать этот массив и, следовательно, сборщик мусора не будет собирать эту память.
Например
или
Когда мы указываем
a.length
, мы просто сбрасываем границы массива и память для остальных элементов массива будет связана сборщиком мусора.Вместо этих двух решений лучше.
а также
Как и в предыдущем ответе от kenshou.html, второй метод быстрее.
источник
a.length
, я не вижу, что этот новый ответ добавляет в ветку?a.length=0;
выполнении? Как эти двигатели будут действовать дляa.length=500;
иa.length=4;
?var a = [1]; var b = a; a.length = 0; console.log(b)
печатаетArray [ ]
, так что не похоже, что он создает новый массив для меня.Используйте измененную версию первоначального предложения Яна :
источник
Если вы используете константы, то у вас нет выбора:
Вы не можете переназначить:
Вы можете только усечь:
источник
Чтобы очистить текущую ячейку памяти массива, используйте:
'myArray.length = 0'
или'myArray.pop() UN-till its length is 0'
length
: Вы можете установить свойство length для усечения массива в любое время. Когда вы расширяете массив, изменяя его свойство length, количество реальных элементов увеличивается.pop()
Метод pop удаляет последний элемент из массива и возвращает возвращаемое удаленное значение.shift()
: Метод shift удаляет элемент с нулевым индексом и сдвигает значения по последовательным индексам вниз, а затем возвращает удаленное значение.Пример:
new Array() | []
Создайте массив с новой ячейкой памяти с помощьюArray constructor
илиarray literal
.slice()
Используя функцию слайса, мы получаем поверхностную копию элементов из исходного массива с новым адресом памяти, так что любая модификация cloneArr не повлияет на фактический | оригинальный массив.источник
length = ?
а не простоlength
.Я удивлен, что никто еще не предложил это:
Это дает массив в совершенно отличном состоянии от других решений. В некотором смысле массив был «очищен»:
Вы можете создать эквивалентный массив с
[,,,,]
илиArray(4)
источник
Используйте ниже, если вам нужно очистить Angular 2+ FormArray.
источник