Szukam metody wkładki do tablicy JavaScript w stylu:

arr.insert(index, item)

Najlepiej w jQuery, ale w tym momencie wykonuje każde wdrożenie JavaScript.

3589
tags2k 25 luty 2009, 17:29

16 odpowiedzi

Najlepsza odpowiedź

Co chcesz, jest splice Funkcja na native obiektu tablicy.

arr.splice(index, 0, item); Wstaw item do arr w określonym indeksie (Usuwanie {x3}} pierwsze elementy, to znaczy, to tylko wkładka).

W tym przykładzie utworzymy tablicę i dodamy do niego element do indeksu 2:

var arr = [];
arr[0] = "Jani";
arr[1] = "Hege";
arr[2] = "Stale";
arr[3] = "Kai Jim";
arr[4] = "Borge";

console.log(arr.join());
arr.splice(2, 0, "Lene");
console.log(arr.join());
5270
Gabor 20 grudzień 2020, 16:19

Oto dwa sposoby:

const array = [ 'My', 'name', 'Hamza' ];

array.splice(2, 0, 'is');

console.log("Method 1 : ", array.join(" "));

LUB

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

const array = [ 'My', 'name', 'Hamza' ];
array.insert(2, 'is');

console.log("Method 2 : ", array.join(" "));
10
M. Hamza Rajput 28 sierpień 2019, 09:28

Możesz zaimplementować metodę Array.insert, robiąc to:

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

Następnie możesz go używać tak, jak:

var arr = [ 'A', 'B', 'D', 'E' ];
arr.insert(2, 'C');

// => arr == [ 'A', 'B', 'C', 'D', 'E' ]
312
K.Dᴀᴠɪs 30 marzec 2018, 21:26

Inne niż splice, możesz użyć tego podejścia, które nie będzie mutacji oryginalnej tablicy, ale utworzy nową tablicę z dodatkowym elementem. Zwykle należy unikać mutacji, gdy tylko jest to możliwe. Używam tutaj operatora ES6.

const items = [1, 2, 3, 4, 5]

const insert = (arr, index, newItem) => [
  // part of the array before the specified index
  ...arr.slice(0, index),
  // inserted item
  newItem,
  // part of the array after the specified index
  ...arr.slice(index)
]

const result = insert(items, 1, 10)

console.log(result)
// [1, 10, 2, 3, 4, 5]

Można to wykorzystać do dodania więcej niż jednego elementu, ulepszając funkcję bitową, aby użyć operatora odpoczynku dla nowych elementów i rozprzestrzenił się również w zwracanym wyniku

const items = [1, 2, 3, 4, 5]

const insert = (arr, index, ...newItems) => [
  // part of the array before the specified index
  ...arr.slice(0, index),
  // inserted items
  ...newItems,
  // part of the array after the specified index
  ...arr.slice(index)
]

const result = insert(items, 1, 10, 20)

console.log(result)
// [1, 10, 20, 2, 3, 4, 5]
166
gafi 4 lipiec 2016, 09:18

Metody niestandardowe insert

1. Z wieloma argumentami i wsparciem łańcuchowym

/* Syntax:
   array.insert(index, value1, value2, ..., valueN) */

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

Może wstawić wiele elementów (jako rodzimy {x0}} robi) i obsługuje łańcucha:

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

2. Z argumentami typu array łączącym i nośnikiem łańcuchowym

/* Syntax:
   array.insert(index, value1, value2, ..., valueN) */

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

Może scalić tablicę z argumentów z daną tablicą, a także obsługuje łańcuch:

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

demo: http://jsfiddle.net/upphh/

76
VisioN 5 kwiecień 2013, 16:44

Jeśli chcesz wstawić wiele elementów do tablicy po raz wymeldować tę odpowiedź przepełnienia stosu: Lepszy sposób na połączenie tablicy do tablicy w JavaScript

Oto kilka funkcji, aby zilustrować oba przykłady:

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

Wreszcie tutaj jest jsfiddle, dzięki czemu możesz go zobaczyć dla siebie: http://jsfiddle.net/luisperezphd/wc8as/ .

I tak używasz funkcji:

// 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);
42
Community 23 maj 2017, 12:10

W przypadku prawidłowego funkcjonalnego programowania i celów łańcuchowych wynalazek Array.prototype.insert() jest niezbędny. Właściwie Splice może być idealne, gdyby zwrócił zmutowaną tablicę zamiast całkowicie bezsensownej tablicy. Więc tutaj idzie

Array.prototype.insert = function(i,...rest){
  this.splice(i,0,...rest)
  return this
}

var a = [3,4,8,9];
document.write("<pre>" + JSON.stringify(a.insert(2,5,6,7)) + "</pre>");

Dobrze OK Powyższe z Array.prototype.splice() Jeden mrukietuje oryginalną tablicę, a niektórzy mogą narzekać jak "Nie powinieneś modyfikować tego, co nie należy do Ciebie" i może się okazać, że będzie dobrze. Więc dla dobra społecznego chciałbym dać kolejny Array.prototype.insert(), który nie ma się zmienia oryginalnej tablicy. Oto jest;

Array.prototype.insert = function(i,...rest){
  return this.slice(0,i).concat(rest,this.slice(i));
}

var a = [3,4,8,9],
    b = a.insert(2,5,6,7);
console.log(JSON.stringify(a));
console.log(JSON.stringify(b));
21
Redu 22 maj 2016, 21:43

dołącz pojedynczy element w określonym indeksie

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

dołącz wiele elementów w określonym indeksie

//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
16
Ryan Taylor 19 lipiec 2018, 13:20

Innym możliwym rozwiązaniem, z wykorzystaniem Array#reduce.

var arr = ["apple", "orange", "raspberry"],
    arr2 = [1, 2, 4];

function insert(arr, item, index) {
    arr = arr.reduce(function(s, a, i) {
      i == index ? s.push(item, a) : s.push(a);
      return s;
    }, []);   
    console.log(arr);
}

insert(arr, "banana", 1);
insert(arr2, 3, 2);
8
kind user 22 lipiec 2020, 19:01

Array#splice() jest sposobem, aby iść, chyba że naprawdę chcesz uniknąć mutacji tablica. Biorąc pod uwagę 2 tablice arr1 i arr2, oto włączenie zawartości arr2 do arr1 Po pierwszym elemencie:


const arr1 = ['a', 'd', 'e'];
const arr2 = ['b', 'c'];

arr1.splice(1, 0, ...arr2); // arr1 now contains ['a', 'b', 'c', 'd', 'e']

console.log(arr1)

Jeśli martwisz się o zmianę tablicy (na przykład, jeśli używasz niezmiennych.js), możesz zamiast tego używać slice(), nie należy mylić z splice() za pomocą" p ".

const arr3 = [...arr1.slice(0, 1), ...arr2, ...arr1.slice(1)];
7
Community 14 maj 2020, 09:56

Nawet jeśli już to odpowiem, dodam tę notatkę na alternatywne podejście.

Chciałem umieścić znaną liczbę elementów do tablicy, na określone pozycje, ponieważ wychodzą z "arracji asocjacyjnej" (tj. Obiekt), który z definicji nie jest zagwarantowany w pewnym sortowaniu zamówienie. Chciałem powstałą tablicę być tablicą obiektów, ale obiekty mają być w określonej kolejności w tablicy, ponieważ tablica gwarantuje ich zamówienie. Więc to zrobiłem.

Najpierw obiekt źródłowy, łańcuch JSONB pobrany z PostgreSQL. Chciałem go posortować własność "Zamów" w każdym obiekcie dziecka.

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

Ponieważ znana jest liczba węzłów w obiekcie, najpierw utworzyłem tablicę o określonej długości:

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

Następnie iteruj obiekt, umieszczając nowo utworzone tymczasowe obiekty do pożądanych lokalizacji w tablicy bez naprawdę "sortowania".

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
K.Dᴀᴠɪs 30 marzec 2018, 21:26

Każdy, kto wciąż ma problemy z tym i próbowałem wszystkich opcji powyżej i nigdy go nie otrzymałem. Udostępniam to rozwiązanie, ma to wziąć pod uwagę, że nie ma wyraźnego określenia właściwości obiektu vs tablicy.

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

Jest to kombinacja iteracji tablicy odniesienia i porównania go do obiektu, który chcesz sprawdzić, konwertować obie z nich do łańcucha, a następnie idziesz, jeśli się dopasowany. Wtedy możesz się liczyć. Można to poprawić, ale to jest miejsce, w którym się osiedliłem. Mam nadzieję że to pomoże.

4
Clyde 6 grudzień 2018, 04:26

Wykonywanie zysku metody redukcji, co następujące:

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

W ten sposób możemy zwrócić nową tablicę (będzie fajny sposób funkcjonalny - bardziej lepszy niż użycie push lub splice) z elementem wstawionym w indeksie, a jeśli indeks jest większy niż długość tablicy, zostanie wstawiona na końcu.

4
alejoko 12 styczeń 2019, 17:04

Próbowałem tego i działa dobrze!

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

Indeks to pozycja, w której chcesz wstawić lub usunąć element. 0 I.. Drugi parametr określa liczbę elementów z indeksu, który ma zostać usunięty, są nowe wpisy, które chcesz wykonać w tablicy. Może to być jeden lub więcej niż jeden.

initialArr.splice(2, 0, "Nigeria");
initialArr.splice(2, 0, "Australia","UK");
3
K.Dᴀᴠɪs 30 marzec 2018, 21:27

Oto funkcja pracy, której używam w jednym z moich zastosowań.

To sprawdza, czy wyjście przedmiotu

let ifExist = (item, strings = [ '' ], position = 0) => {
     // output into an array with empty string. Important just in case their is no item. 
    let output = [ '' ];
    // check to see if the item that will be positioned exist.
    if (item) {
        // output should equal to array of strings. 
        output = strings;
       // use splice in order to break the array. 
       // use positition param to state where to put the item
       // and 0 is to not replace an index. Item is the actual item we are placing at the prescribed position. 
        output.splice(position, 0, item);
    }
    //empty string is so we do not concatenate with comma or anything else. 
    return output.join("");
};

A potem nazywam to poniżej.

ifExist("friends", [ ' ( ', ' )' ], 1)}  // output: ( friends )
ifExist("friends", [ ' - '], 1)}  // output:  - friends 
ifExist("friends", [ ':'], 0)}  // output:   friends: 
2
Lesly Revenge 16 luty 2019, 22:48

Trochę starszego wątku, ale muszę zgodzić się z Redem powyżej, ponieważ Splice zdecydowanie ma trochę mylącego interfejsu. A odpowiedź podana przez CDBajorina, że ​​"zwraca tylko pustą tablicę, gdy drugi parametr wynosi 0. Jeśli jest większy niż 0, zwraca elementy usunięte z tablicy" jest, jednocześnie dokładne, udowodniając punkt. Intencją funkcji jest splić lub wspomniany wcześniej przez Jakob Keller, "Dołączyć lub Connect, Również zmienić. Masz ustaloną tablicę, którą teraz zmieniając, co obejmuje dodawanie lub usuwanie elementów ...." Biorąc pod uwagę, Wartość zwracana elementów, jeśli taka została usunięta, jest najlepiej niezręczna. I 100% zgadzam się, że ta metoda mogła być lepiej dostosowana do łańcucha, gdyby wróciła, co wydaje się naturalne, nowa tablica z dodanymi elementami. Wtedy możesz robić takie jak ["19", "17"]. Splice (1,0, "18"). Dołącz ("...") lub cokolwiek chcesz z zwróconą tablicą. Fakt, że zwraca to, co zostało usunięte, jest tylko nonsensowne imho. Jeśli zamiarem sposobu było "wyciąć zestaw elementów" i może to tylko intencyjny, może. Wygląda na to, że nie wiem, co cię wycinam, prawdopodobnie mam niewielki powód, by wyciąć te elementy, prawda? Byłoby lepiej, gdyby zachowywał się jak concat, map, zmniejszyć, plasterek itp., W którym wykonany jest nowa tablica z istniejącej tablicy, a nie mutacji istniejącej tablicy. Wszystkie są łączone, a to znacząca kwestia. To raczej wspólna dla manipulacji tablicy łańcuchowej. Wydaje się, że język musi iść jeden lub drugi kierunek i spróbować trzymać się tak bardzo, jak to możliwe. JavaScript jest funkcjonalny i mniej deklaratywny, wydaje się to dziwne odchylenie od normy.

2
meem 18 lipiec 2019, 17:38