Kaip įterpti elementą į masyvą konkrečiame indekse?

Ieško javascript masyvo įterpimo metodo stiliaus:

 arr.insert(index, item) 

Pageidautina, kad jQuery, bet bet koks „JavaScript“ įgyvendinimas bus atliekamas šiuo metu.

2294
25 февр. nustatyta kaip tags2k 25 Vas 2009-02-25 17:29 '09, 17:29, 2009-02-25 17:29
@ 14 atsakymų

Ką norite, yra splice funkcija savo masyve.

arr.splice(index, 0, item); įterpia item į nustatytą indeksą (pirmiausia pašalinsite 0 elementų, ty tik įterpiant).

Šiame pavyzdyje mes sukursime masyvą ir į jį įtrauksime elementą 2:

3766
25 февр. Atsakymą pateikė TVanfosson vasario 25 d. 2009-02-25 17:32 '09, 17:32 2009-02-25 17:32

Array.insert metodą galite įgyvendinti atlikdami šiuos veiksmus:

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

Tada galite jį naudoti taip:

 var arr = [ 'A', 'B', 'D', 'E' ]; arr.insert(2, 'C'); // => arr == [ 'A', 'B', 'C', 'D', 'E' ] 
227
03 окт. atsakymą pateikė FrEsC 81 03 okt. 2012-10-03 17:26 '12 at 17:26 pm 2012-10-03 17:26

Pasirinktinio insert masyvo metodai

1. Su keliais argumentais ir grandinės palaikymu

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

Jis gali įterpti kelis elementus (pvz., Gimtoji dalis) ir palaiko grandinę:

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

2. Su masyvo parama, skirta sujungti ir įpareigoti argumentus

  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; }; 

Jis gali sujungti masyvus iš argumentų su konkrečia masyvu ir taip pat palaiko grandinę:

 ["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 atsakymą „ VisioN“ pateikė kovo 25 d. 13 val. 20:45 2013-03-25 20:45

Be šlifavimo, galite naudoti šį metodą, kuris nesusimagins originalaus masyvo, bet sukurs naują masyvą su pridėtu elementu. Paprastai reikia vengti mutacijų. Čia naudoju es6 dauginimo operatorių.

63
04 июля '16 в 12:18 2016-07-04 12:18 atsakymą pateikė „ Gaafar “ liepos 16 d. 12:18 2016-07-04 12:18

Jei norite į masyvą vienu metu įterpti kelis elementus, patikrinkite šį atsakymą: geriausias būdas susieti masyvą į masyvą javascript

Taip pat yra keletas funkcijų, kurios iliustruoja abu pavyzdžius:

 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; } 

Galiausiai čia yra jsFiddle, kad galėtumėte jį pamatyti sau: http://jsfiddle.net/luisperezphd/Wc8aS/

Štai kaip jūs naudojate funkcijas:

 // 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 авг. Luiso Perezo atsakymas, rugpjūčio 30 d. 2012-08-30 07:37 '12 at 7:37 am 2012-08-30 07:37

Norint tinkamai funkcionuoti ir sutelkti dėmesį, svarbu sugalvoti Array.prototype.insert() . Tiesą sakant, splicing gali būti tobula, jei ji grąžina mutuotą masyvą, o ne visiškai tuščią matricą. Taigi čia

15
14 мая '16 в 2:22 2016-05-14 02:22 atsakymas pateiktas Redu gegužės 14 d., 16 d., 2:22. 2016-05-14 02:22

Tokiu atveju, aš rekomenduoju naudoti gryną „ JavaScript“ , „ JavaScript“ taip pat nėra įterpimo metodo, bet mes turime metodą, kuris yra įmontuotas Array metodas, kuris atlieka užduotį jums, jis vadinamas splice ...

Pažiūrėkime, kad splice () ...

Metodas () susieja masyvo turinį, ištrindamas esamus elementus ir (arba) pridedant naujus elementus.

Gerai, įsivaizduokite, kad mes turime šią masyvą žemiau:

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

Mes galime ištrinti 3 taip:

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

Ji sugrįš 3, bet jei mes patikrinsime, ar dabar yra:

 [1, 2, 4, 5] 

Iki šiol taip gerai, bet kaip mes galime pridėti naują elementą masyvui, naudojant splicing? Leiskite jam sugrįžti 3 ...

 arr.splice(2, 0, 3); 

Pažiūrėkime, ką darėme ...

Dar kartą naudojame splicing , bet šį kartą antrajam argumentui mes perduodame 0 , o tai reiškia, kad norime ištrinti elementą, bet tuo pačiu metu pridėsime trečiąjį argumentą, kuris bus įtrauktas į antrąjį indeksą ...

Turėtumėte žinoti, ką galime pašalinti ir pridėti vienu metu, pavyzdžiui, dabar galime padaryti:

 arr.splice(2, 2, 3); 

Kuris pašalins 2 elementus 2 rodyklėje, tada pridėsite 3 rodiklį 2 ir rezultatas bus:

 [1, 2, 3, 5]; 

Tai rodo, kaip kiekvienas elementas veikia splicing:

array.splice (pradėti, ištrintiCount, item1, item2, item3 ...)

9
25 дек. Atsakymas duotas Alireza gruodžio 25 d. 2017-12-25 16:04 '17, 16:04 pm 2017-12-25 16:04

Tai yra:

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

Pristato elementą arr su nurodytu index (pirmiausia pašalindami 0 elementų, tai yra, tiesiog įterpiant).

8
24 февр. atsakymą pateikė hannad rehman 24 vasaris. 2017-02-24 16:29 '17, 16:29 pm 2017-02-24 16:29

Kitas galimas sprendimas yra „ Array#reduce .

5
05 апр. atsakymas suteikiamas natūra 05 balandžio 2017-04-05 20:06 '17 at 20:06 2017-04-05 20:06

Net jei į tai jau buvo atsakyta, pridedu šią pastabą dėl alternatyvaus požiūrio.

Aš norėjau į masyvą įdėti tam tikrą skaičių elementų tam tikrose pozicijose, nes jos yra atskiriamos nuo „asociatyviosios masyvo“ (ty, objekto), kuris pagal apibrėžimą nėra garantuotas kaip rūšiuojama tvarka. Aš norėjau, kad gauta masyvas būtų objektų masyvas, tačiau objektai buvo tam tikroje eilėje, nes masyvas garantuoja jų tvarką. Taigi aš tai padariau.

Pirmiausia šaltinio objektas - JSONB eilutė, gauta iš PostgreSQL. Aš norėjau, kad jis būtų surūšiuotas pagal kiekvienos vaiko objekto „užsakymo“ nuosavybę.

 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); 

Kadangi objektų mazgų skaičius žinomas, pirmiausia sukuriu masyvą, kurio ilgis yra nurodytas:

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

Ir tada iš naujo išbandykite objektą, įdėdami naujai sukurtus laikinus objektus į tinkamas vietas masyvo be rūšiavimo.

 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 дек. atsakymas duotas Ville 04 dec. 2015-12-04 21:36 '15 - 21:36 2015-12-04 21:36

Pridėkite vieną elementą prie konkretaus indekso

 //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'; 

Pridėkite kelis elementus prie konkretaus indekso

 //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 atsakymą įteikė Srikrushna Pal birželio 28 d. 18 d. 10:13 val. 2018-06-28 22:13

Aš išbandžiau ir jis veikia gerai!

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

Indeksas - tai vieta, kurioje norite įterpti arba ištrinti elementą. 0, t.y. Antrasis parametras nustato elementų iš ištrinamo objekto skaičių - tai nauji įrašai, kuriuos norite sukurti masyve. Jis gali būti vienas ar daugiau.

 initialArr.splice(2, 0, "Nigeria"); initialArr.splice(2, 0, "Australia","UK"); 
2
08 марта '17 в 9:35 2017-03-08 09:35 atsakymą pateikė Pawan kovo 8 d. 17 d. 9:35 2017-03-08 09:35

Kiekvienas, kuriam kyla problemų, ir išbandė visas aukščiau pateiktas galimybes ir niekada to nepadarė. Sutinku su savo sprendimu, reikia nepamiršti, kad nenorite aiškiai nurodyti objekto ir masyvo savybių.

 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; } 

Tai yra nuorodų masyvo kartojimas ir palyginimas su objektu, kurį norite patikrinti, konvertuoti abu juos į eilutę ir tada pakartokite, jei jis atitinka. Tada galite tiesiog suskaičiuoti. Tai gali būti pagerinta, bet tai yra, kur aš išsprendžiau. Tikiuosi, kad tai padės.

1
06 дек. Atsakymą pateikė Clyde 06 dec. 2018-12-06 07:26 '18, 07:26 am 2018-12-06 07:26

Pelno sumažinimas taikant sumažinimo metodą:

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

Taigi, tokiu būdu mes galime grąžinti naują masyvą (tai bus vėsus funkcinis būdas - daug geriau nei naudojant stūmoklį) su elementu, įterptu į indeksą, ir jei indeksas yra didesnis už masyvo ilgį, jis bus įterptas pabaigoje.

0
12 янв. atsakymas, kurį pateikė alejoko sausio 12 d 2019-01-12 20:04 '19 , 8:04 val. 2019-01-12 20:04

Kiti klausimai apie „ etiketes „ arba užduoda klausimą