Domanda Come inserire un elemento in una matrice in un indice specifico?


Sto cercando un metodo di inserimento di array Javascript, nello stile di:

arr.insert(index, item)

Preferibilmente in jQuery, ma qualsiasi implementazione Javascript farà a questo punto.


2074
2018-02-25 14:29


origine


risposte:


Quello che vuoi è il splice funzione sull'oggetto matrice nativo.

arr.splice(index, 0, item); inserirà item in arr all'indice specificato (eliminazione 0 articoli in primo luogo, cioè, è solo un inserto).

In questo esempio creeremo un array e ne aggiungeremo un elemento nell'indice 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());


3436
2018-02-25 14:32



È possibile implementare il Array.insert metodo in questo modo:

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

Quindi puoi usarlo come:

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

// => arr == [ 'A', 'B', 'C', 'D', 'E' ]

207
2017-10-03 14:26



Array personalizzato insert metodi

1. Con più argomenti e supporto per il concatenamento

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

Può inserire più elementi (come nativi splice fa) e supporta il concatenamento:

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

2. Con argomenti di tipo array unendo e concatenando il supporto

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

Può unire gli array dagli argomenti con l'array specificato e supporta anche il concatenamento:

["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/


63
2018-03-25 17:45



Oltre alla giunzione, è possibile utilizzare questo approccio che non muterà la matrice originale, ma creerà una nuova matrice con l'elemento aggiunto. Di solito dovresti evitare la mutazione ogni volta che è possibile. Sto usando l'operatore di diffusione ES6 qui.

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]

Questo può essere usato per aggiungere più di un elemento modificando leggermente la funzione per utilizzare l'operatore di resto per i nuovi elementi e diffonderlo anche nel risultato restituito

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]


54
2017-07-04 09:18



Se vuoi inserire più elementi in un array contemporaneamente, prova questa risposta di Overflow dello stack: Un modo migliore per unire un array in un array in javascript

Anche qui ci sono alcune funzioni per illustrare entrambi gli esempi:

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

Finalmente ecco un jsFiddle così puoi vederlo da solo: http://jsfiddle.net/luisperezphd/Wc8aS/

E questo è il modo in cui usi le funzioni:

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

33
2017-08-30 04:37



Per una corretta programmazione funzionale e concatenazione, un'invenzione di Array.prototype.insert() è essenziale. In realtà la giuntura avrebbe potuto essere perfetta se avesse restituito la matrice mutata invece di una matrice vuota totalmente priva di significato. Quindi qui va

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

Bene, ok, quanto sopra con il Array.prototype.splice() uno muta l'array originale e alcuni potrebbero lamentarsi del tipo "non dovresti modificare ciò che non ti appartiene" e questo potrebbe rivelarsi giusto. Quindi per il benessere pubblico vorrei dare un altro Array.prototype.insert() che non modifica la matrice originale. Eccolo;

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


14
2018-05-13 23:22



Raccomando di usare puro JavaScript anche in questo caso non c'è alcun metodo di inserimento in JavaScript, ma abbiamo un metodo che è a Matrice integrata metodo che fa il lavoro per te, è chiamato giuntura...

Vediamo cosa c'è splice ()...

Il metodo splice () modifica il contenuto di un array rimuovendo   elementi esistenti e / o aggiunta di nuovi elementi.

OK, immagina di avere questo array qui sotto:

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

Possiamo rimuovere 3 come questo:

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

Restituirà 3, ma se controlliamo l'arrro ora, abbiamo:

[1, 2, 4, 5]

Fin qui, tutto bene, ma come possiamo aggiungere un nuovo elemento all'array usando splice? Riportiamo 3 nell'arr ...

arr.splice(2, 0, 3);

Vediamo cosa abbiamo fatto ...

Noi usiamo giuntura di nuovo, ma questa volta per il secondo argomento, passiamo 0, significa che non vogliamo eliminare nessun elemento, ma allo stesso tempo aggiungiamo il terzo argomento che è 3 che verrà aggiunto al secondo indice ...

Dovresti essere consapevole, che possiamo Elimina e Inserisci allo stesso tempo, per esempio ora possiamo fare:

arr.splice(2, 2, 3);

Che cancellerà 2 articoli a indice 2, quindi aggiungere 3 all'indice 2 e il risultato sarà:

[1, 2, 3, 5];

Questo mostra come funziona ogni oggetto in splice:

array.splice (start, deleteCount, item1, item2, item3 ...)


7
2017-12-25 13:04



Un'altra possibile soluzione, con l'uso di 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);


5
2018-04-05 17:06



Anche se questo è già stato risolto, sto aggiungendo questa nota per un approccio alternativo.

Volevo inserire un numero conosciuto di oggetti in un array, in posizioni specifiche, quando escono da un "array associativo" (cioè un oggetto) che per definizione non è garantito che si trovi in ​​un ordine ordinato. Volevo che l'array risultante fosse una matrice di oggetti, ma gli oggetti fossero in un ordine specifico nell'array poiché un array garantisce il loro ordine. Quindi l'ho fatto.

Prima l'oggetto sorgente, una stringa JSONB recuperata da PostgreSQL. Volevo che fosse ordinato dalla proprietà "order" in ogni oggetto child.

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

Poiché il numero di nodi nell'oggetto è noto, per prima cosa creo un array con la lunghezza specificata:

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

Quindi, itera l'oggetto, posizionando gli oggetti temporanei appena creati nelle posizioni desiderate nell'array senza realmente alcun "ordinamento" in atto.

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
2017-12-04 18:36



Ho provato questo e sta funzionando bene!

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

L'indice è la posizione in cui si desidera inserire o eliminare l'elemento. 0 cioè i secondi parametri definiscono il numero di elementi dall'indice da rimuovere item sono le nuove voci che vuoi creare in array. Può essere uno o più di uno.

initialArr.splice(2, 0, "Nigeria");
initialArr.splice(2, 0, "Australia","UK");

2
2018-03-08 06:35