Як ўставіць элемент у масіў па вызначаным індэксе?

Я шукаю метад ўстаўкі масіва JavaScript у стылі:

 arr.insert(index, item) 

Пераважна ў jQuery, але любая рэалізацыя JavaScript будзе рабіць у гэты момант.

2294
25 февр. зададзены tags2k 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.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 адказ дадзены Gaafar 04 ліпеня '16 ў 12:18 2016/07/04 00: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); constants or variables // 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 авг. адказ дадзены Luis Perez 30 жнів. 2012-08-30 07:37 '12 у 07: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 () ...

Метад splice () змяняе змесціва масіва шляхам выдалення існуючых элементаў і / або дадання новых элементаў.

ОК, уявіце, што ў нас ёсць гэты масіў ніжэй:

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

Мы можам выдаліць 3 наступным чынам:

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

Ён верне 3, але калі мы праверым arr зараз, у нас ёсць:

 [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 (start, deleteCount, item1, item2, item3 ...)

9
25 дек. адказ дадзены Alireza 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 апр. адказ дадзены kind user 05 крас. 2017-04-05 20:06 '17 у 20:06 2017/04/05 20:06

Нават калі на гэта ўжо быў дадзены адказ, я дадаю гэтую нататку для альтэрнатыўнага падыходу.

Я хацеў змяшчаць вядомае колькасць элементаў у масіў у пэўныя пазіцыі, паколькі яны адрываюцца ад "асацыятыўнага масіва" (г.зн. аб'екта), які па вызначэнні не гарантавана знаходзіцца ў адсартаваным парадку. Я хацеў, каб выніковы масіў быў масівам аб'ектаў, але аб'екты былі ў пэўным парадку ў масіве, так як масіў гарантуе іх парадак. Таму я зрабіў гэта.

Спачатку зыходны аб'ект, радок JSONB, атрыманая з PostgreSQL. Я хацеў, каб ён адсартаваныя па ўласцівасці "order" у кожным даччыным аб'екце.

 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 снеж. 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 адказ дадзены Pawan 08 сакавіка '17 а 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 снеж. 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) з элементам, устаўленым у index, і калі індэкс больш даўжыні масіва, ён будзе ўстаўлены ў канцы.

0
12 янв. адказ дадзены alejoko 12 студз. 2019-01-12 20:04 '19 у 20:04 2019/01/12 20:04

Іншыя пытанні па пазнаках або Задайце пытанне