Как да вмъкнем елемент в масив при определен индекс?

Търся метод за вмъкване на масив на javascript в стила:

 arr.insert(index, item) 

За предпочитане в jQuery, но всяка реализация на javascript ще направи в този момент.

2294
25 февр. настроено на тагове2k 25 февруари 2009-02-25 17:29 '09 в 17:29 2009-02-25 17:29
@ 14 отговора

Това, което искате, е функцията за splice на собствения ви масив.

arr.splice(index, 0, item); ще вмъкне item в arr на указания индекс (първо ще премахне 0 елемента, т.е. просто вмъкване).

В този пример ще създадем масив и ще го добавим към индекс 2:

3766
25 февр. Отговорът е даден от tvanfosson на 25 февруари. 2009-02-25 17:32 '09 в 17:32 2009-02-25 17:32

Можете да Array.insert метода Array.insert , като изпълните следните стъпки:

 Array.prototype.insert = function ( index, item ) { this.splice( index, 0, item ); }; 
border=0

След това можете да го използвате по следния начин:

 var arr = [ 'A', 'B', 'D', 'E' ]; arr.insert(2, 'C'); // => arr == [ 'A', 'B', 'C', 'D', 'E' ] 
227
03 окт. отговорът е даден от FrEsC 81 03 окт. 2012-10-03 17:26 '12 в 17:26 ч. 2012-10-03 17:26

Методи за персонализирано insert

1. С няколко аргумента и верижна подкрепа

  Array.prototype.insert = function(index) { this.splice.apply(this, [index, 0].concat( Array.prototype.slice.call(arguments, 1))); return this; }; 

Той може да вмъкне няколко елемента (като роден splice ) и поддържа веригата:

 ["a", "b", "c", "d"].insert(2, "X", "Y", "Z").slice(1, 6); // ["b", "X", "Y", "Z", "c"] 

2. Поддържане на масиви за обединяване и обвързващи аргументи

  Array.prototype.insert = function(index) { index = Math.min(index, this.length); arguments.length > 1  this.splice.apply(this, [index, 0].concat([].pop.call(arguments)))  this.insert.apply(this, arguments); return this; }; 

Тя може да комбинира масиви от аргументи с даден масив и също поддържа верига:

 ["a", "b", "c", "d"].insert(2, "V", ["W", "X", "Y"], "Z").join("-"); // "abVWXYZcd" 

DEMO: http://jsfiddle.net/UPphH/

66
25 марта '13 в 20:45 2013-03-25 20:45 отговорът беше даден от VisioN на 25 март'13 в 20:45 2013-03-25 20:45

В допълнение към сплайсинга, можете да използвате този подход, който няма да мутира оригиналния масив, но ще създаде нов масив с добавения елемент. Обикновено трябва да избягвате мутации. Аз използвам оператора за разпространение на es6 тук.

63
04 июля '16 в 12:18 2016-07-04 12:18 отговорът е даден от Гаафар на 4 юли в 12:18 ч. 2016-07-04 12:18

Ако искате да вмъкнете няколко елемента наведнъж в масив, проверете този отговор: най -добрият начин да придадете масив на масив в javascript

Също така тук има някои функции, които илюстрират и двата примера:

 function insertAt(array, index) { var arrayToInsert = Array.prototype.splice.apply(arguments, [2]); return insertArrayAt(array, index, arrayToInsert); } function insertArrayAt(array, index, arrayToInsert) { Array.prototype.splice.apply(array, [index, 0].concat(arrayToInsert)); return array; } 

И накрая, тук е jsFiddle, така че можете да го видите сами: http://jsfiddle.net/luisperezphd/Wc8aS/

Ето как използвате функциите:

 // if you want to insert specific values whether constants or variables: insertAt(arr, 1, "x", "y", "z"); // OR if you have an array: var arrToInsert = ["x", "y", "z"]; insertArrayAt(arr, 1, arrToInsert); 
32
30 авг. отговор, даден от Луис Перес 30 август. 2012-08-30 07:37 '12 в 7:37 ч. 2012-08-30 07:37

За правилното функционално програмиране и фокусиране е важно да се измисли Array.prototype.insert() . Всъщност сплайсингът може да бъде перфектен, ако връща мутирал масив вместо напълно безсмислен празен масив. Така че тук е

15
14 мая '16 в 2:22 2016-05-14 02:22 Отговорът е даден на Redu 14 май '16 в 2:22 ч . 2016-05-14 02:22

В този случай, аз препоръчвам да използвате чист JavaScript , няма и метод за вмъкване в JavaScript, но имаме метод, който е вграден метод Array , който изпълнява задачата за вас, нарича се splice ...

Нека видим, че снаждане () ...

Методът splice () променя съдържанието на масив чрез изтриване на съществуващи елементи и / или добавяне на нови елементи.

Добре, представете си, че имаме този масив по-долу:

 const arr = [1, 2, 3, 4, 5]; 

Можем да изтрием 3 както следва:

 arr.splice(arr.indexOf(3), 1); 

Ще се върне 3, но ако проверим сега, имаме:

 [1, 2, 4, 5] 

Досега е добре, но как можем да добавим нов елемент към масив, като използваме сплайсинг? Нека се върне 3 в ...

 arr.splice(2, 0, 3); 

Нека видим какво направихме ...

Ние използваме отново сплайсинг , но този път за втория аргумент предаваме 0 , което означава, че искаме да изтрием елемента, но в същото време ще добавим третия аргумент, който ще бъде добавен във втория индекс ...

Трябва да знаете какво можем да премахнем и добавим едновременно, например, сега можем да направим:

 arr.splice(2, 2, 3); 

Което ще премахне 2 позиции в индекс 2, след това ще добави 3 в индекс 2, а резултатът ще бъде:

 [1, 2, 3, 5]; 

Това показва как всеки елемент работи в снаждането:

array.splice (начало, deleteCount, item1, item2, item3 ...)

9
25 дек. Отговорът се дава на Алиреза 25 декември. 2017-12-25 16:04 '17 в 16:04 часа 2017-12-25 16:04

Това е:

 var arr= ["India","China","Japan","USA"]; arr.splice(index, 0, item); 

Въвежда елемента в arr с указания index (първо премахва 0 елемента, т.е. просто вмъкване).

8
24 февр. отговорът е даден от hannad rehman 24 февруари. 2017-02-24 16:29 '17 в 16:29 часа 2017-02-24 16:29

Друго възможно решение е използването на Array#reduce .

5
05 апр. отговорът се дава на добрия потребител 05 април 2017-04-05 20:06 '17 в 20:06 2017-04-05 20:06

Дори ако това вече е получено, добавям тази бележка за алтернативен подход.

Исках да поставя известен брой елементи в масив в определени позиции, тъй като те са отделени от "асоциативен масив" (т.е. обект), който по дефиниция не е гарантиран в подреден ред. Исках полученият масив да бъде масив от обекти, но обектите бяха в определен ред в масива, тъй като масивът гарантира техния ред. Така го направих.

Първо, източникът на обекта, JSONB низът, получен от PostgreSQL. Исках да се сортира по свойство "ред" във всеки обект-дете.

 var jsonb_str = '{"one": {"abbr": "", "order": 3}, "two": {"abbr": "", "order": 4}, "three": {"abbr": "", "order": 5}, "initialize": {"abbr": "init", "order": 1}, "start": {"abbr": "", "order": 2}}'; var jsonb_obj = JSON.parse(jsonb_str); 

Тъй като броят на възлите в обекта е известен, първо създавам масив с определена дължина:

 var obj_length = Object.keys(jsonb_obj).length; var sorted_array = new Array(obj_length); 

След това опитайте отново обекта, поставяйки новосъздадените временни обекти на правилните места в масива, без никакво сортиране.

 for (var key of Object.keys(jsonb_obj)) { var tobj = {}; tobj[key] = jsonb_obj[key].abbr; var position = jsonb_obj[key].order - 1; sorted_array[position] = tobj; } console.dir(sorted_array); 
5
04 дек. отговорът е даден на Ville 04 dec. 2015-12-04 21:36 '15 в 21:36 2015-12-04 21:36

Добавете отделен елемент към определен индекс

 //Append at specific position(here at index 1) arrName.splice(1, 0,'newName1'); //1: index number, 0: number of element to remove, newName1: new element //Append at specific position (here at index 3) arrName[3] = 'newName1'; 

Добавете няколко елемента в определен индекс

 //Append from index number 1 arrName.splice(1, 0,'newElemenet1', 'newElemenet2', 'newElemenet3'); //1: index number from where append start, //0: number of element to remove, //newElemenet1,2,3: new elements 
4
28 июня '18 в 22:13 2018-06-28 22:13 отговорът е даден от Srikrushna Pal на 28 юни 18 в 22:13 ч. 2018-06-28 22:13

Опитах го и тя работи добре!

 var initialArr = ["India","China","Japan","USA"]; initialArr.splice(index, 0, item); 

Индексът е позицията, в която искате да вмъкнете или изтриете елемент. 0, т.е. Вторият параметър определя броя на елементите от обекта, който ще бъде изтрит - това са новите записи, които искате да създадете в масива. То може да бъде едно или повече.

 initialArr.splice(2, 0, "Nigeria"); initialArr.splice(2, 0, "Australia","UK"); 
2
08 марта '17 в 9:35 2017-03-08 09:35 Отговорът е даден от Паван 08 март 2017 г. в 9:35 часа 2017-03-08 09:35

Всеки, който има проблеми с това, и се опита всички опции по-горе и никога не го получи. Споделям моето решение, трябва да се има предвид, че не искате изрично да посочите свойствата на вашия обект и масив.

 function isIdentical(left, right){ return JSON.stringify(left) === JSON.stringify(right); } function contains(array, obj){ let count = 0; array.map((cur) => { if(this.isIdentical(cur, obj)) count++; }); return count > 0; } 

Това е комбинация от повторение на масив от препратки и сравняването му с обекта, който искате да проверите, конвертирайки и двата от тях в низ и след това повторете, ако той съвпада. Тогава можете просто да преброите. Това може да се подобри, но тук се установих. Надявам се това да помогне.

1
06 дек. Отговорът е даден от Clyde 06 dec. 2018-12-06 07:26 '18 в 7:26 ч. 2018-12-06 07:26

Вземане на печалба по метода на намаляване, както следва:

 function insert(arr, val, index) { return index >= arr.length ? arr.concat(val) : arr.reduce((prev, x, i) => prev.concat(i === index ? [val, x] : x), []); } 

По този начин, по този начин можем да върнем нов масив (това ще бъде страхотен функционален начин - много по-добре от използването на push или splice) с елемента, вмъкнат в индекса, и ако индексът е по-голям от дължината на масива, той ще бъде вмъкнат в края.

0
12 янв. отговор, даден от alejoko 12 януари 2019-01-12 20:04 '19 в 20:04 ч. 2019-01-12 20:04

Други въпроси относно етикетите или Задайте въпрос