У меня есть массив JavaScript, dataArray
который я хочу вставить в новый массив newArray
. За исключением того, что я не хочу newArray[0]
быть dataArray
. Я хочу вставить все элементы в новый массив:
var newArray = [];
newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...
или даже лучше:
var newArray = new Array (
dataArray1.values(),
dataArray2.values(),
// ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);
Теперь новый массив содержит все значения отдельных массивов данных. Есть ли какие-то сокращения, pushValues
доступные, чтобы мне не приходилось перебирать каждого человека dataArray
, добавляя элементы по одному?
javascript
arrays
BBA
источник
источник
Ответы:
Используйте функцию concat , вот так:
Значение
newArray
будет[1, 2, 3, 4]
(arrayA
иarrayB
останется неизменным;concat
создает и возвращает новый массив для результата).источник
Google Chrome
: Быстрая (CONCAT = победитель),Opera
быстроту (CONCAT = победитель),IE
: медленнее (CONCAT = победитель),Firefox
: медленный (push.apply = победитель, но в 10 раз медленнее , чем CONCAT Хрома) ... говорят о плохой реализации двигателя JS ,push
что не сгладит массив значений.concat
достигает того, что требует вопрос.Если ваши массивы не велики (см. Предостережение ниже), вы можете использовать
push()
метод массива, к которому вы хотите добавить значения.push()
может принимать несколько параметров, чтобы вы могли использовать егоapply()
метод для передачи массива значений, которые должны быть переданы в виде списка параметров функции. Это имеет преимущество перед использованиемconcat()
добавления элементов в массив вместо создания нового массива.Однако, кажется, что для больших массивов (порядка 100 000 членов или более) этот трюк может потерпеть неудачу . Для таких массивов лучше использовать цикл. См. Https://stackoverflow.com/a/17368101/96100 для получения подробной информации.
Вы можете обобщить это в функцию:
... или добавьте его в
Array
прототип:... или эмулировать оригинальный
push()
метод, разрешив несколько параметров, используя тот факт, чтоconcat()
, напримерpush()
, допускает несколько параметров:Вот основанная на циклах версия последнего примера, подходящая для больших массивов и всех основных браузеров, включая IE <= 8:
источник
newArray.push.apply(newArray, dataArray1);
дает так же, какArray.prototype.push.applay(newArray,dataArra1);
Array.prototype.concat
это не плохо, скорее это просто неправильно понято и иногда неправильно. При этих обстоятельствах это только неправильно понято, но не неправильно.Я добавлю еще один ответ на будущее
В ECMAScript 6 вы можете использовать синтаксис Spread :
Синтаксис распространения еще не включен во все основные браузеры. Текущую совместимость смотрите в этой (постоянно обновляемой) таблице совместимости .
Однако вы можете использовать синтаксис распространения с Babel.js .
редактировать:
См. Ответ Джека Гиффина ниже для получения дополнительной информации о производительности. Кажется, concat все еще лучше и быстрее, чем оператор распространения.
источник
newArray.apply(newArray, dataArray1)
.Найден элегантный способ от MDN
Или вы можете использовать
spread operator
функцию ES6:источник
Это решает вашу проблему?
источник
Следующее кажется мне самым простым:
Так как «push» принимает переменное число аргументов, вы можете использовать
apply
методpush
функции для выталкивания всех элементов другого массива. Он создает вызов для push, используя свой первый аргумент (здесь «newArray») в качестве «this» и элементы массива в качестве оставшихся аргументов.Оператор
slice
in first получает копию первого массива, поэтому вы не должны изменять его.Обновление Если вы используете версию javascript с доступным слайсом, вы можете упростить
push
выражение до:источник
Функция ниже не имеет проблемы с длиной массивов и работает лучше, чем все предлагаемые решения:
к сожалению, jspref отказывается принимать мои материалы, поэтому они представляют результаты с использованием benchmark.js
где
для цикла и толчка это:
Нажмите Применить:
оператор распространения:
и, наконец, «установить длину и цикл» является вышеупомянутой функцией
источник
𝗥𝗲𝘀𝗲𝗮𝗿𝗰𝗵 𝗔𝗻𝗱 𝗥𝗲𝘀𝘂𝗹𝘁𝘀
Для факта, тест производительности в jsperf и проверка некоторых вещей в консоли выполняются. Для исследования используется сайт irt.org . Ниже собрана коллекция всех этих источников вместе с примером функции внизу.
Как видно из вышесказанного, я бы сказал, что Concat почти всегда является способом обеспечения как производительности, так и способности сохранять редкость запасных массивов. Затем для лайков массива (таких как DOMNodeLists
document.body.children
) я бы рекомендовал использовать цикл for, поскольку он является вторым по производительности и единственным другим методом, который сохраняет разреженные массивы. Ниже мы быстро рассмотрим, что имеется в виду под разреженными массивами и подобными массивами, чтобы устранить путаницу.𝗧𝗵𝗲 𝗙𝘂𝘁𝘂𝗿𝗲
Поначалу некоторые люди могут подумать, что это случайность, и что производители браузеров в конечном итоге доберутся до оптимизации Array.prototype.push, чтобы быть достаточно быстрыми, чтобы превзойти Array.prototype.concat. НЕПРАВИЛЬНО! Array.prototype.concat всегда будет быстрее (в принципе, по крайней мере), потому что это просто копирование и вставка данных. Ниже приведена упрощенная наглядная диаграмма того, как может выглядеть реализация 32-битного массива (обратите внимание, что реальные реализации намного сложнее)
Как видно выше, все, что вам нужно сделать, чтобы скопировать что-то подобное, почти так же просто, как копировать его байт за байтом. С Array.prototype.push.apply это намного больше, чем просто копирование и вставка данных. «.Apply» должен проверить каждый индекс в массиве и преобразовать его в набор аргументов, прежде чем передать его в Array.prototype.push. Затем Array.prototype.push должен дополнительно выделять больше памяти каждый раз, и (для некоторых реализаций браузера) может даже пересчитывать некоторые данные поиска позиции для разреженности.
Альтернативный способ думать об этом - это. Исходный массив один - это большая стопка бумаг, сшитых вместе. Массив источника два - это еще одна большая стопка бумаг. Будет ли это быстрее для вас
В приведенной выше аналогии вариант № 1 представляет Array.prototype.concat, а № 2 представляет Array.prototype.push.apply. Давайте проверим это с помощью аналогичного JSperf, отличающегося только тем, что этот тестирует методы над разреженными, а не сплошными массивами. Это можно найти прямо здесь .
Поэтому я ограничусь тем, что будущее производительности для этого конкретного варианта использования лежит не в Array.prototype.push, а скорее в Array.prototype.concat.
𝗖𝗹𝗮𝗿𝗶𝗳𝗶𝗰𝗮𝘁𝗶𝗼𝗻𝘀
𝗦𝗽𝗮𝗿𝗲 𝗔𝗿𝗿𝗮𝘆𝘀
Когда некоторые члены массива просто отсутствуют. Например:
Кроме того, javascript позволяет легко инициализировать запасные массивы.
𝗔𝗿𝗿𝗮𝘆-𝗟𝗶𝗸𝗲𝘀
Подобный массиву объект - это объект, который имеет хотя бы
length
свойство, но не был инициализирован с помощьюnew Array
или[]
; Например, нижеприведенные объекты классифицируются как массивы.Наблюдайте, что происходит, используя метод, который преобразует лайки массивов в массивы, такие как слайс.
Показать фрагмент кода
Наблюдайте за тем, что происходит, используя метод, который не преобразует подобные массивы в массивы, такие как concat.
Показать фрагмент кода
источник
В JavaScript ES6 вы можете использовать оператор ... в качестве оператора распространения, который по существу преобразует массив в значения. Затем вы можете сделать что-то вроде этого:
Хотя синтаксис и лаконичен, я не знаю, как это работает внутри и как это влияет на производительность больших массивов.
источник
Array.push.apply
техники.Вот способ ES6
источник
Есть несколько ответов, касающихся Array.prototype.push.apply . Вот яркий пример:
Если у вас есть синтаксис ES6:
источник
Если вы хотите изменить исходный массив, вы можете распространить и нажать:
Если вы хотите убедиться, что в
source
массив попадают только элементы одного типа (например, не смешивая числа и строки), используйте TypeScript.источник
У нас есть два массива a и b. код, который сделал здесь, это массив значений помещается в массив b.
источник
Попробуй это:
источник
вместо push () используйте функцию concat для IE. пример,
источник
Это рабочий код, и он отлично работает:
источник