Я ищу метод вставки массива JavaScript, в стиле:
arr.insert(index, item)
Желательно в jQuery, но любая реализация JavaScript подойдет на этом этапе.
javascript
jquery
arrays
tags2k
источник
источник
Ответы:
То, что вы хотите, это
splice
функция над собственным объектом массива.arr.splice(index, 0, item);
вставитitem
вarr
указанный индекс (0
сначала удаляя элементы, то есть просто вставку).В этом примере мы создадим массив и добавим в него элемент в индекс 2:
источник
arr.splice(2,3)
удалит 3 элемента, начиная с индекса 2. Без передачи 3-го .... N-го параметра ничего не вставляется. Таким образом, имяinsert()
не делает это справедливо либо.Вы можете реализовать
Array.insert
метод, выполнив это:Тогда вы можете использовать его как:
источник
Array.prototype.insert = function (index, items) { this.splice.apply(this, [index, 0].concat(items)); }
Помимо сращивания, вы можете использовать этот подход, который не будет изменять исходный массив, но создаст новый массив с добавленным элементом. Обычно вы должны избегать мутаций, когда это возможно. Я использую ES6 спред оператора здесь.
Это можно использовать для добавления более одного элемента, немного подправив функцию, чтобы использовать оператор rest для новых элементов, и распространить ее в возвращаемом результате.
источник
Пользовательские
insert
методы массива1. С несколькими аргументами и поддержкой цепочки
Он может вставлять несколько элементов (как это
splice
делает нативный ) и поддерживает цепочку:2. С поддержкой слияния и создания цепочек аргументов
Он может объединять массивы из аргументов с данным массивом, а также поддерживает цепочку:
ДЕМО: http://jsfiddle.net/UPphH/
источник
["b", "X", "Y", "Z", "c"]
. Почему не"d"
входит? Мне кажется, что если вы установите 6 в качестве второго параметраslice()
и в массиве есть 6 элементов, начиная с указанного индекса, то вы должны получить все 6 элементов в возвращаемом значении. (В документе говоритсяhowMany
об этом параметре.) Developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(3, 3);
=>[ ]
slice
метод, а не методsplice
, на который вы ссылаетесь в комментарии. Второй параметрslice
(namedend
) - это индекс, начинающийся с нуля, на котором заканчивается извлечение.slice
выдержки до, но не включаяend
. Следовательно, послеinsert
того, как у вас есть["a", "b", "X", "Y", "Z", "c", "d"]
, из которогоslice
извлекаются элементы с индексами от1
до6
, то есть от"b"
до,"d"
но не включая"d"
. Имеет ли это смысл?Если вы хотите вставить несколько элементов в массив одновременно, проверьте ответ Stack Overflow: лучший способ объединить массив в массив в javascript
Также вот несколько функций для иллюстрации обоих примеров:
Наконец, вот jsFiddle, так что вы можете увидеть его сами: http://jsfiddle.net/luisperezphd/Wc8aS/
И вот как вы используете функции:
источник
Для правильного функционального программирования и создания цепочек изобретение
Array.prototype.insert()
является существенным. На самом деле, сплайсинг мог бы быть идеальным, если бы он возвращал измененный массив вместо совершенно бессмысленного пустого массива. Так что здесь идетХорошо, все вышеперечисленное с тем, что
Array.prototype.splice()
мутирует исходный массив, а некоторые могут жаловаться, что «вы не должны изменять то, что вам не принадлежит», и это может оказаться правильным. Поэтому для общественного блага я хотел бы дать другой,Array.prototype.insert()
который не изменяет первоначальный массив. Здесь это идет;источник
splice
изменяете исходный массив, я не думаю, что «правильное функциональное программирование» принадлежит где-то поблизостиsplice
.В этом случае я рекомендую использовать чистый JavaScript , также в JavaScript нет метода вставки, но у нас есть метод, который является встроенным методом Array, который выполняет эту работу за вас, он называется splice ...
Посмотрим, что такое склейка () ...
Хорошо, представьте, что у нас есть этот массив ниже:
Мы можем удалить
3
так:Он вернет 3, но если мы проверим arr сейчас, мы имеем:
Пока все хорошо, но как мы можем добавить новый элемент в массив, используя соединение? Давайте вернем 3 в обр ...
Посмотрим, что мы сделали ...
Мы снова используем splice , но на этот раз для второго аргумента мы передаем 0 , что означает, что мы не хотим удалять элемент, но в то же время мы добавляем третий аргумент, который будет 3, который будет добавлен во второй индекс ...
Вы должны знать, что мы можем удалять и добавлять одновременно, например, теперь мы можем сделать:
Который удалит 2 элемента в индексе 2, затем добавит 3 в индексе 2, и результат будет:
Это показывает, как работает каждый элемент в соединении:
источник
Добавить отдельный элемент по определенному индексу
Добавить несколько элементов по определенному индексу
источник
arrName[3] = 'newName1';
, если в массиве всего 3 элемента. Если в индексе 3 есть элемент, он будет заменен. Если вы хотите добавить в конце, лучше использоватьarrName.push('newName1');
Другое возможное решение, с использованием
Array#reduce
.источник
Вот два способа:
ИЛИ
источник
Хотя на этот вопрос уже дан ответ, я добавляю эту заметку для альтернативного подхода.
Я хотел поместить известное количество элементов в массив, в определенные позиции, так как они выходят из «ассоциативного массива» (то есть объекта), который по определению не гарантированно находится в отсортированном порядке. Я хотел, чтобы результирующий массив был массивом объектов, но объекты должны быть в определенном порядке в массиве, так как массив гарантирует их порядок. Я так и сделал.
Сначала исходный объект, строка JSONB, полученная из PostgreSQL. Я хотел отсортировать его по свойству order в каждом дочернем объекте.
Поскольку число узлов в объекте известно, я сначала создаю массив с указанной длиной:
А затем выполните итерацию объекта, поместив вновь созданные временные объекты в нужные места в массиве без какой-либо «сортировки».
источник
Любой, у кого все еще есть проблемы с этим и попробовал все варианты выше и никогда не получил это. Я поделюсь своим решением, это принять во внимание, что вы не хотите явно указывать свойства вашего объекта против массива.
Это комбинация итерации ссылочного массива и сравнения его с объектом, который вы хотите проверить, преобразовать их оба в строку, а затем повторить, если она совпадает. Тогда вы можете просто посчитать. Это можно улучшить, но это то, где я остановился. Надеюсь это поможет.
источник
Взятие прибыли по методу снижения следующим образом:
Таким образом, таким образом мы можем вернуть новый массив (это будет классный функциональный способ - гораздо лучше, чем использовать push или splice) с элементом, вставленным в index, и, если индекс больше длины массива, он будет вставлен в конце.
источник
Array#splice()
это путь, если вы действительно не хотите избежать изменения массива. Учитывая 2 массиваarr1
иarr2
, вот как вы должны вставить содержимоеarr2
вarr1
после первого элемента:Если вас беспокоит изменение массива (например, при использовании Immutable.js), вы можете вместо этого использовать
slice()
, не путатьsplice()
с a'p'
.источник
Я попробовал это, и он работает нормально!
Индекс - это позиция, в которую вы хотите вставить или удалить элемент. 0 т.е. вторые параметры определяют номер элемента из индекса, который будет удален. Элемент - это новые записи, которые вы хотите сделать в массиве. Это может быть один или несколько.
источник
Вот рабочая функция, которую я использую в одном из своих приложений.
Это проверяет, если пункт выхода
И тогда я называю это ниже.
источник
Немного более старая тема, но я должен согласиться с Реду выше, потому что у splice определенно немного запутанный интерфейс. И ответ, данный cdbajorin, что «он возвращает пустой массив только тогда, когда второй параметр равен 0. Если он больше 0, он возвращает элементы, удаленные из массива», является точным доказательством этого. Функция предназначена для соединения или, как уже было сказано ранее, Якоба Келлера, «для присоединения или подключения, а также для изменения. У вас есть установленный массив, который вы сейчас изменяете, который включает добавление или удаление элементов…». Учитывая это, возвращаемое значение элементов, если они были удалены, в лучшем случае неудобно. И я на 100% согласен, что этот метод мог бы лучше подходить для цепочки, если бы он возвратил то, что кажется естественным, новый массив с добавленными элементами сращивания. Затем вы можете делать что-то вроде ["19", "17"]. Splice (1,0, "18"). Join ("...") или что угодно с возвращаемым массивом. Тот факт, что он возвращает то, что было удалено, является просто бессмысленным ИМХО. Если целью метода было «вырезать набор элементов», и это было только его намерением, может быть. Похоже, если я не знаю, что я уже вырезал, у меня, вероятно, нет особых причин вырезать эти элементы, не так ли? Было бы лучше, если бы он вел себя как concat, map, Reduce, Slice и т. Д., Где новый массив сделан из существующего массива, а не изменял существующий массив. Все они цепные, и это серьезная проблема. Это довольно распространенное явление для манипулирования массивами. Похоже, что язык должен идти в ту или иную сторону и стараться придерживаться его как можно больше. Javascript, будучи функциональным и менее декларативным, просто кажется странным отклонением от нормы.
источник
Представление
Сегодня (2020.04.24) я выполняю тесты для выбранных решений для больших и маленьких массивов. Я тестировал их на MacOs High Sierra 10.13.6 на Chrome 81.0, Safari 13.1, Firefox 75.0.
Выводы
Для всех браузеров
slice
иreduce
(D, E, F) обычно в 10-100 раз быстрее, чем решения на местеsplice
(AI, BI, CI) были самыми быстрыми (иногда ~ 100x - но это зависит от размера массива)подробности
Тесты были разделены на две группы: решения на месте (AI, BI, CI) и решения не на месте (D, E, F) и выполнялись для двух случаев.
Протестированный код представлен в следующем фрагменте
Показать фрагмент кода
Пример результатов для маленького массива на Chrome ниже
источник