Vraag Hoe een artikel in een array in te voegen bij een specifieke index?


Ik zoek een Javascript-array-invoegmethode, in de stijl van:

arr.insert(index, item)

Het liefst in jQuery, maar elke Javascript-implementatie doet het op dit moment.


2075
2018-02-25 14:29


oorsprong


antwoorden:


Wat je wilt is het splice functie op het native array-object.

arr.splice(index, 0, item); zal invoegen item in arr op de opgegeven index (verwijderen 0 items eerst, dat wil zeggen, het is maar een invoeging).

In dit voorbeeld zullen we een array maken en een element eraan toevoegen in index 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());


3437
2018-02-25 14:32



U kunt het implementeren Array.insert methode door dit te doen:

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

Dan kun je het gebruiken als:

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

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

207
2017-10-03 14:26



Aangepaste matrix insert methoden

1. Met meerdere argumenten en ondersteuning voor ketenen

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

Het kan meerdere elementen invoegen (als native splice doet) en ondersteunt het ketenen:

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

2. Met argumenten voor het combineren en koppelen van arraytypen

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

Het kan arrays samenvoegen van de argumenten met de gegeven array en ondersteunt ook het ketenen:

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



Anders dan splice, kunt u deze benadering gebruiken die de oorspronkelijke array niet zal muteren, maar een nieuwe array met het toegevoegde item zal maken. Meestal moet je mutaties vermijden waar mogelijk. Ik gebruik ES6 spread operator hier.

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]

Dit kan worden gebruikt om meer dan één item toe te voegen door de functie een beetje aan te passen om de restoperator voor de nieuwe items te gebruiken, en dit ook in het geretourneerde resultaat te verspreiden

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



Als u meerdere elementen tegelijk in een array wilt invoegen, bekijk dan dit antwoord voor Stack Overflow: Een betere manier om een ​​array in een array in javascript te splitsen

Hier zijn ook enkele functies om beide voorbeelden te illustreren:

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

Eindelijk is hier een jsFiddle zodat je het voor jezelf kunt zien: http://jsfiddle.net/luisperezphd/Wc8aS/

En dit is hoe je de functies gebruikt:

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



Voor de juiste functionele programmering en kettingdoeleinden een uitvinding van Array.prototype.insert() is essentieel. Eigenlijk zou splice perfect zijn geweest als het de gemuteerde array had geretourneerd in plaats van een volledig nietszeggende lege array. Dus hier gaat het

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

Nou ok het bovenstaande met de Array.prototype.splice() men muteert de originele array en sommigen klagen misschien als "je moet niet wijzigen wat niet van jou is" en dat zou ook kunnen kloppen. Dus voor het openbaar welzijn zou ik graag een ander geven Array.prototype.insert() die de oorspronkelijke array niet muteert. Hier gaan we;

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



Ik raad aan puur te gebruiken JavaScript in dit geval is er ook geen invoegmethode in JavaScript, maar we hebben een methode die een is ingebouwde array methode die het werk voor je doet, het wordt genoemd verbinding...

Laten we kijken wat er is splice ()...

De methode splice () verandert de inhoud van een array door deze te verwijderen   bestaande elementen en / of nieuwe elementen toevoegen.

OK, stel je voor dat we onderstaande array hebben:

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

We kunnen verwijderen 3 soortgelijk:

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

Het zal 3 retourneren, maar als we de arr controleren, hebben we:

[1, 2, 4, 5]

Tot nu toe, zo goed, maar hoe kunnen we een nieuw element aan array toevoegen met behulp van splice? Laten we 3 terugzetten in de arr ...

arr.splice(2, 0, 3);

Laten we eens kijken wat we hebben gedaan ...

We gebruiken verbinding nogmaals, maar deze keer voor het tweede argument, gaan we voorbij 0, betekent dat we geen item willen verwijderen, maar tegelijkertijd toevoegen we een derde argument dat 3 is dat zal worden toegevoegd bij de tweede index ...

Je moet weten dat we dat kunnen verwijderen en toevoegen op hetzelfde moment, bijvoorbeeld nu kunnen we doen:

arr.splice(2, 2, 3);

Die zal verwijderen 2 items bij index 2, voeg dan toe 3 bij index 2 en het resultaat zal zijn:

[1, 2, 3, 5];

Dit laat zien hoe elk item in splice werkt:

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


7
2017-12-25 13:04



Een andere mogelijke oplossing, met gebruik van 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



Hoewel dit al is beantwoord, voeg ik deze notitie toe voor een alternatieve aanpak.

Ik wilde een plaatsen bekend nummer van items in een array, in specifieke posities, omdat ze van een "associatieve array" (d.w.z. een object) komen die per definitie niet gegarandeerd in een gesorteerde volgorde is. Ik wilde dat de resulterende array een array van objecten is, maar de objecten in een specifieke volgorde in de array omdat een array hun order garandeert. Dus ik deed dit.

Eerst het bronobject, een JSONB-string die is opgehaald uit PostgreSQL. Ik wilde het laten sorteren op de eigenschap "order" in elk onderliggende object.

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

Omdat het aantal knooppunten in het object bekend is, maak ik eerst een array met de opgegeven lengte:

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

En dan itereer het object, plaats de nieuw gecreëerde tijdelijke objecten op de gewenste locaties in de array zonder echt enige "sortering" plaats te vinden.

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