Wie entferne ich ein Objekt mit JavaScript aus einem Array?

74

Ich habe ein JavaScript-Objekt wie dieses:

id="1";
name = "serdar";

und ich habe ein Array, das viele Objekte von oben enthält. Wie kann ich ein Objekt wie folgt aus diesem Array entfernen:

obj[1].remove();
Mavera
quelle

Antworten:

197

Gut splicefunktioniert:

var arr = [{id:1,name:'serdar'}];
arr.splice(0,1);
// []

Verwenden Sie den deleteOperator NICHT für Arrays. deleteentfernt keinen Eintrag aus einem Array, sondern ersetzt ihn einfach durch undefined.

var arr = [0,1,2];
delete arr[1];
// [0, undefined, 2]

Aber vielleicht willst du so etwas?

var removeByAttr = function(arr, attr, value){
    var i = arr.length;
    while(i--){
       if( arr[i] 
           && arr[i].hasOwnProperty(attr) 
           && (arguments.length > 2 && arr[i][attr] === value ) ){ 

           arr.splice(i,1);

       }
    }
    return arr;
}

Nur ein Beispiel unten.

var arr = [{id:1,name:'serdar'}, {id:2,name:'alfalfa'},{id:3,name:'joe'}];
removeByAttr(arr, 'id', 1);   
// [{id:2,name:'alfalfa'}, {id:3,name:'joe'}]

removeByAttr(arr, 'name', 'joe');
// [{id:2,name:'alfalfa'}]
BGerrissen
quelle
11
Ich würde dir +10 geben, wenn ich kann: D
Fadi
3
Ich weiß, dass dieser Kommentar einige Zeit später kommt ... aber diese Funktion ist brillant und ich muss Kredit geben, wo Kredit fällig ist !!! Vielen Dank.
Daniel C
2
Ausgezeichnet, genau das, was ich brauchte, +10 Champion. XD
Shortys Oberto Dutari
1
Sehr schöne Lösung clt-c clt-v und Boom!
verfolgt
1
sehr sehr nützliche Antwort. Fantastische Antwort
Arun Nagar
90

Wenn Sie Zugriff auf ES2015-Funktionen haben und nach einem funktionaleren Ansatz suchen, würde ich Folgendes wählen:

const people = [
  { id: 1, name: 'serdar' },
  { id: 5, name: 'alex' },
  { id: 300, name: 'brittany' }
];

const idToRemove = 5;

const filteredPeople = people.filter((item) => item.id !== idToRemove);

// [
//   { id: 1, name: 'serdar' },
//   { id: 300, name: 'brittany' }
// [

Achtung, es filter()ist nicht mutierend, sodass Sie ein neues Array zurückerhalten.

Weitere Informationen finden Sie in den Mozilla Developer Network-Hinweisen zu Filter .

Benjamin S. Leveritt
quelle
3
das sollte die akzeptierte Antwort sein. schön und einfach!
Stophface
this.is ('was ich gesucht habe');
Nilsw
26

Sie können entweder die splice()Methode oder den deleteOperator verwenden.

Der Hauptunterschied besteht darin, dass beim Löschen eines Array-Elements mit dem deleteOperator die Länge des Arrays nicht beeinflusst wird, selbst wenn Sie das letzte Element des Arrays löschen. Andererseits splice()verschiebt das Verfahren alle Elemente so, dass keine Löcher an der Stelle des gelöschten Elements verbleiben.

Beispiel mit dem deleteOperator:

var trees = ["redwood", "bay", "cedar", "oak", "maple"];  
delete trees[3];  
if (3 in trees) {  
   // this does not get executed  
}
console.log(trees.length);  //  5
console.log(trees);         //  ["redwood", "bay", "cedar", undefined, "maple"]

Beispiel mit der splice()Methode:

var trees = ["redwood", "bay", "cedar", "oak", "maple"];  
trees.splice(3, 1);
console.log(trees.length);  //  4
console.log(trees);         //  ["redwood", "bay", "cedar", "maple"]
Daniel Vassallo
quelle
11

Ich benutze das ziemlich oft, also habe ich einen kleinen Prototyp erstellt. Sucht einfach nach dem Gegenstand und zieht ihn heraus, wenn eine Übereinstimmung vorliegt.

//Prototype to remove object from array, removes first
//matching object only
Array.prototype.remove = function (v) {
    if (this.indexOf(v) != -1) {
        this.splice(this.indexOf(v), 1);
        return true;
    }
    return false;
}

Kann wie folgt aufgerufen werden:

var arr = [12, 34, 56];
arr.remove(34);

Das Ergebnis wäre [12, 56]

Hat eine boolesche Rückgabe, wenn das Entfernen erfolgreich war, false, wenn das Element nicht vorhanden war.

Sechs Fuß Drei Fuß
quelle
5

Wenn Sie den Index kennen, den das Objekt innerhalb des Arrays hat, können Sie splice () verwenden, wie andere erwähnt haben, dh:

var removedObject = myArray.splice(index,1);
removedObject = null;

Wenn Sie den Index nicht kennen, müssen Sie das Array danach durchsuchen, dh:

for (var n = 0 ; n < myArray.length ; n++) {
    if (myArray[n].name == 'serdar') {
      var removedObject = myArray.splice(n,1);
      removedObject = null;
      break;
    }
}

Marcelo

Marcelo
quelle
5

Sauberster und schnellster Weg (ES6)

const apps = [
  {id:1, name:'Jon'}, 
  {id:2, name:'Dave'},
  {id:3, name:'Joe'}
]

//remove item with id=2
const itemToBeRemoved = {id:2, name:'Dave'}

apps.splice(apps.findIndex(a => a.id === itemToBeRemoved.id) , 1)

//print result
console.log(apps)

Ajin
quelle
Ajine danke da. :)
Mansoorkhan Cherupuzha
2

var arr = [{id:1,name:'serdar'}, {id:2,name:'alfalfa'},{id:3,name:'joe'}];
var ind = arr.findIndex(function(element){
   return element.id===2;
})
if(ind!==-1){
arr.splice(ind, 1)
}
console.log (arr)

Bitte beachten Sie, dass die findIndex-Methode in Internet Explorer nicht unterstützt wird, Polyfill jedoch von hier aus verwendet werden kann

Manoj
quelle
1
  //K.I.S.S. method
  //(the setup/comments is/are longer than the code)
  //cards is a two dimensional array object
  //  has an array object with 4 elements at each first dimensional index
  //var cards = new Array()
  //cards[cards.length] = new Array(name, colors, cost, type)
  //Can be constructed with Associated arrays, modify code as needed.
  //my test array has 60 'cards' in it
  //  15 'cards' repeated 4 times each
  //  groups were not sorted prior to execution
  //  (I had 4 groups starting with 'U' before the first 'A')
  //Should work with any dimensionality as long as first
  //index controls sort order

  //sort and remove duplicates
  //Algorithm:
  //  While same name side by side, remove higher entry;
  //  assumes 'cards' with same name have same other data
  //  (otherwise use cards[i-1] === cards[i] to compare array objects).
  //Tested on IE9 and FireFox (multiple version #s from 31 up).
  //Also tested by importing array data from 5MB text file.
  //Quick execution
  cards.sort()
  for (i=1; i<cards.length-1; i++){
    while (cards[i-1][0] == cards[i][0]){
       cards.splice(i,1)
    }
  }
James V. Fields
quelle
0

Verwenden Sie die Spleißmethode .

(Zumindest nehme ich an, dass dies die Antwort ist. Sie sagen, Sie haben ein Objekt , aber der von Ihnen angegebene Code erstellt nur zwei Variablen, und es gibt keine Anzeichen dafür, wie das Array erstellt wird.)

QUentin
quelle
0

Verwenden Sie das Schlüsselwort delete.

delete obj[1];

BEARBEITEN: Siehe: Löschen von Array-Elementen in JavaScript - Löschen gegen Spleißen löschen definiert den Versatz, entfernt den Eintrag jedoch nicht vollständig. Splice wäre richtig, wie David sagte.

Stefan Hoth
quelle
1
In Bezug auf " deletewird den Offset undefinieren, aber nicht vollständig entfernen" - dies ist nicht ganz korrekt, da deletedas Element vollständig entfernt wird, wie im if (3 in trees)Test in meiner Antwort gezeigt. Das einzige ist, dass die anderen Elemente nicht verschoben werden, um das Loch zu füllen, sodass die Länge nicht beeinflusst wird. Wenn Sie also das Array anzeigen, werden Sie dort ankommen, undefinedwo sich das Loch befindet ...
Daniel Vassallo
... Die Verwendung deleteist jedoch nicht dasselbe wie das Setzen eines Elements auf undefined. Dies wird auch hier erklärt: developer.mozilla.org/en/Core_JavaScript_1.5_Reference/…
Daniel Vassallo
@ Daniel: Ich habe mich falsch ausgedrückt, aber ich meinte das gleiche. :-)
Stefan Hoth
0
delete obj[1];

Beachten Sie, dass dadurch die Array-Indizes nicht geändert werden. Alle Array-Mitglieder, die Sie löschen, bleiben als "Slots" erhalten undefined.

Tomalak
quelle
0

var apps = [{id: 34, Name: 'Meine App', andere: 'Ding'}, {id: 37, Name: 'Meine neue App', andere: 'Dinge'}];

// Index des Objekts mit der ID: 37 abrufen

var removeIndex = apps.map (Funktion (Element) {return item.id;}). indexOf (37);

// Objekt entfernen

apps.splice (removeIndex, 1);

Suraj Sangani
quelle
0

Wenn wir ein Array von Objekten haben, möchten wir ein Objekt nur mit der Eigenschaft id entfernen

var apps = [
       {id:34,name:'My App',another:'thing'},
       {id:37,name:'My New App',another:'things'
}];

Holen Sie sich den Index des Objekts mit der ID: 37

var removeIndex = apps.map(function(item) { return item.id; }).indexOf(37);

// remove object

apps.splice(removeIndex, 1);
Pruthvi Reddy
quelle
-1

Wenn es das letzte Element im Array ist, können Sie dies tun obj.pop()

3rgo
quelle
-1
var user = [
  { id: 1, name: 'Siddhu' },
  { id: 2, name: 'Siddhartha' },
  { id: 3, name: 'Tiwary' }
];

var recToRemove={ id: 1, name: 'Siddhu' };

user.splice(user.indexOf(recToRemove),1)
Siddhartha
quelle