Entfernen Sie die Eigenschaft für alle Objekte im Array


100

Ich möchte die badEigenschaft von jedem Objekt im Array entfernen . Gibt es einen besseren Weg, als eine forSchleife zu verwenden und sie von jedem Objekt zu löschen?

var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"},...];

for (var i = 0, len = array.length; i < len; i++) {
  delete array[i].bad;
}

Es scheint nur so, als ob es einen Weg geben sollte prototype, etwas zu benutzen oder so. Ich weiß es nicht. Ideen?


1
Egal, die anderen Wege können nicht weniger als lineares O (n) bekommen. Was auch immer Sie verwenden, erfordert den Zugriff auf alle Ihre Array-Elemente
Brian

Prototyp? Wie würde das helfen? Oder sind alle diese Objekte Instanzen desselben Konstruktors und haben einen gemeinsamen Wert für bad?
Bergi

1
@Bergi Ich frage mich, ob sie sich auf den ArrayPrototyp JS beziehen oder auf den Prototyp, den Dystroy beispielhaft darstellt
Ian

Ich bin nicht sicher, ob Sie array.length vor dem Schleifen in einer Variablen speichern sollten. Ich bin sicher, Sie werden sehen, dass es den Schmerz nicht wert ist, wenn Sie sich profilieren.
Denys Séguret

1
@ZackArgyle Ja, im Allgemeinen gibt es nichts schnelleres.
Denys Séguret

Antworten:


112

Die einzigen anderen Möglichkeiten sind kosmetische und sind in der Tat Schleifen.

Zum Beispiel :

array.forEach(function(v){ delete v.bad });

Anmerkungen:

  • Wenn Sie mit IE8 kompatibel sein möchten, benötigen Sie eine Unterlegscheibe für forEach . Wie Sie den Prototyp erwähnen, hat prototype.js auch eine Unterlegscheibe .
  • deleteist einer der schlimmsten "Optimierungskiller" . Die Verwendung beeinträchtigt häufig die Leistung Ihrer Anwendungen. Sie können es nicht vermeiden, wenn Sie eine Eigenschaft wirklich entfernen möchten, aber Sie können die Eigenschaft häufig entweder auf festlegen undefinedoder einfach neue Objekte ohne die Eigenschaft erstellen.

1
Nicht viel besser als die Schleife, wenn die Schleife auch "gefälscht" sein darf: Pfor(var i = 0; i < array.length ) delete array[i].bad
Esailija

1
@Esailija Kommt darauf an. Ich benutze es gerne, forEachweil ich den Code ausdrucksvoller finde (und weil ich vor langer Zeit aufgehört habe, mir Sorgen um den Internet Explorer zu machen).
Denys Séguret

1
Keiner von beiden drückt "radikal schlechte Eigenschaften aller Objekte in diesem Array löschen" auf radikal andere Weise aus. forEachist generisch und semantisch bedeutungslos für sich, wie eine forSchleife.
Esailija

1
@Esailija Ich stimme zu. Deshalb habe ich genau gesagt, dass es "kosmetisch" ist. Ist es nicht klar in meiner Antwort?
Denys Séguret

Unglücklich. Ich bleibe bei der for-Schleife, die im Allgemeinen schneller ist als die forEach. Und wirklich ... wen interessiert IE8? Danke für die Hilfe.
Zack Argyle

150

Mit ES6 können Sie jedes Objekt dekonstruieren, um ein neues Objekt ohne benannte Attribute zu erstellen:

const newArray = array.map(({dropAttr1, dropAttr2, ...keepAttrs}) => keepAttrs)

15
Bei dem anfänglichen Problem kann es seinconst newArray = array.map(({ bad, ...item }) => item);
dhilt

1
Dies ist sehr zu empfehlen, da es das ursprüngliche Array nicht ändert (unveränderliche Operationen)
Pizzicato

1
Dies sollte die akzeptierte Antwort sein, da ein neues Array zurückgegeben wird, anstatt das vorhandene zu überschreiben.
user1275105

Gute Antwort, funktioniert aber nicht, wenn der Name der Eigenschaft einen Punkt (.) enthält, z. B. 'bad.prop'
Yayati

@Amiraslan Ich würde verwenden// eslint-disable-next-line no-unused-vars
piotr_cz

20

Ich bevorzuge die Verwendung von map, um die Eigenschaft zu löschen und dann das neue Array-Element zurückzugeben.

array.map(function(item) { 
    delete item.bad; 
    return item; 
});

10

1
In diesem speziellen Fall wäre eine explizite returnErklärung nicht erforderlich
Sandeep Kumar

4
array.forEach(v => delete v.bad);
Anthony Awuley


9

Eine Lösung mit Prototypen ist nur möglich, wenn Ihre Objekte gleich sind:

function Cons(g) { this.good = g; }
Cons.prototype.bad = "something common";
var array = [new Cons("something 1"), new Cons("something 2"), …];

Aber dann ist es einfach (und O(1)):

delete Cons.prototype.bad;

3

Für meine Meinung ist dies die einfachste Variante

array.map(({good}) => ({good}))

3
Die Frage war, das Böse zu beseitigen und das Gute nicht zu behalten. Wenn Ihre Objekte 10 Felder behalten und eines entfernen müssen, ist die Eingabe der oben genannten Felder sehr lang.
Adrien

0

Ich werde vorschlagen, Object.assigninnerhalb einer forEach()Schleife zu verwenden, damit die Objekte kopiert werden und das ursprüngliche Array von Objekten nicht beeinflusst

var res = [];
array.forEach(function(item) { 
    var tempItem = Object.assign({}, item);
    delete tempItem.bad; 
    res.push(tempItem);
});
console.log(res);

0

Diese Frage ist jetzt etwas alt, aber ich möchte eine alternative Lösung anbieten, die keine Quelldaten mutiert und nur minimalen manuellen Aufwand erfordert:

function mapOut(sourceObject, removeKeys = []) {
  const sourceKeys = Object.keys(sourceObject);
  const returnKeys = sourceKeys.filter(k => !removeKeys.includes(k));
  let returnObject = {};
  returnKeys.forEach(k => {
    returnObject[k] = sourceObject[k];
  });
  return returnObject;
}

const array = [
  {"bad": "something", "good":"something"},
  {"bad":"something", "good":"something"},
];

const newArray = array.map(obj => mapOut(obj, [ "bad", ]));

Es ist immer noch etwas weniger als perfekt, behält jedoch ein gewisses Maß an Unveränderlichkeit bei und bietet die Flexibilität, mehrere Eigenschaften zu benennen, die Sie entfernen möchten. (Vorschläge willkommen)


0

Ich habe versucht, ein neues Objekt zu erstellen, ohne die Coulmns in Vue.js zu löschen.

let data =this.selectedContactsDto[];

// selectedContactsDto [] = Objekt mit Liste der in meinem Projekt erstellten Array-Objekte

console.log (Daten); let newDataObj = data.map (({groupsList, customFields, firstname, ... item}) => item); console.log ("newDataObj", newDataObj);


0

Um ein Schlüsselwertpaar-Formularobjektarray zu entfernen, wird Postgres SQL als Datenbank wie in diesem Beispiel verwendet:

Dies ist ein Benutzerfunktion, das Benutzerdetails zurückgibt. Wir müssen den Schlüssel "api_secret" aus den Zeilen entfernen:

    function getCurrentUser(req, res, next) { // user function
    var userId = res.locals.userId;
    console.log(userId)
    db.runSQLWithParams("select * from users where id = $1", [userId], function(err, rows) {
      if(err){
        console.log(err)
      }
      var responseObject = {
        _embedded: rows,
      }
      responseObject._embedded[0].api_secret = undefined
      // console.log(api);
      // console.log(responseObject);
      res.json(responseObject);
    }); 
}

Die obige Funktion gibt das folgende Objekt als JSON-Antwort zurück

 {
    "_embedded": [
        {
            "id": "0123abd-345gfhgjf-dajd4456kkdj",
            "secret_key: "secret",
            "email": "abcd@email.com",
            "created": "2020-08-18T00:13:16.077Z"
        }
    ]
}

Nach dem Hinzufügen dieser Zeile wird responseObject._embedded[0].api_secret = undefineddas folgende Ergebnis als JSON-Antwort angezeigt:

{
        "_embedded": [
            {
                "id": "0123abd-345gfhgjf-dajd4456kkdj",
                "email": "abcd@email.com",
                "created": "2020-08-18T00:13:16.077Z"
            }
        ]
    }

0

Sie können dieser besser lesbaren, nicht erwarteten Erhöhung folgen, da der Schlüssel nicht gefunden wurde:

data.map((datum)=>{
                    return {
                        'id':datum.id,
                        'title':datum.login,
                    }

-4

var array = [{"bad": "something", "good":"something"},{"bad":"something", "good":"something"}];
var results = array.map(function(item){
  return {good : item["good"]}
});
console.log(JSON.stringify(results));


Können Sie Ihre Lösung erklären?
SG7

Map ist eine neue Datenstruktur in JavaScript ES6. Der angehängte Link könnte Ihnen helfen. hackernoon.com/what-you-should-know-about-es6-maps-dc66af6b9a1e
hk_y

Diese Lösung ist nicht gut, wenn Sie viele Requisiten in Ihren Artikeln haben.
Koop4

Ja! Versucht, einen anderen Ansatz zu bieten.
hk_y
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.