wake-up-neo.com

Entfernen Sie leere Eigenschaften/falsche Werte aus Object mit Underscore.js

Ich habe ein Objekt mit mehreren Eigenschaften. Ich möchte alle Eigenschaften entfernen, die falsche Werte enthalten.

Dies kann mit compact auf Arrays erreicht werden, aber was ist mit Objekten?

81
user1082754

Sie könnten ein eigenes Unterstrich-Plugin (Mixin) erstellen: 

_.mixin({
  compactObject: function(o) {
    _.each(o, function(v, k) {
      if(!v) {
        delete o[k];
      }
    });
    return o;
  }
});

Und dann verwenden Sie es als native Unterstrichmethode: 

var o = _.compactObject({
  foo: 'bar',
  a: 0,
  b: false,
  c: '',
  d: null,
  e: undefined
});

Aktualisieren

Wie @AndreiNeculaudarauf hingewiesen , wirkt sich dieses Mixin auf das ursprüngliche Objekt aus, während die ursprüngliche compact-Unterstrichmethode eine Kopie des Arrays zurückgibt.
Um dieses Problem zu lösen und unsere compactObject mehr zu verhalten, als wäre es cousin, hier ein kleines Update: 

_.mixin({
  compactObject : function(o) {
     var clone = _.clone(o);
     _.each(clone, function(v, k) {
       if(!v) {
         delete clone[k];
       }
     });
     return clone;
  }
});
47
gion_13

Seit der Unterstreichungsversion 1.7.0 können Sie _.pick verwenden:

_.pick(sourceObj, _.identity)

Erläuterung

Der zweite Parameter für _.pick kann eine Prädikatsfunktion zum Auswählen von Werten sein. Werte, für die das Prädikat wahrheitsgemäß zurückgibt, werden ausgewählt, und Werte, für die das Prädikat Falsy zurückgibt, werden ignoriert.

pick _.pick (Objekt, * Tasten)

Gibt eine Kopie von object zurück, die so gefiltert ist, dass sie nur Werte für die keys der Whitelist (oder ein Array gültiger Schlüssel) enthält. Akzeptiert alternativ ein Prädikat, das angibt, welche Schlüssel ausgewählt werden sollen.

_.identity ist eine Hilfsfunktion, die ihr erstes Argument zurückgibt. Dies bedeutet, dass sie auch als Prädikatfunktion fungiert, die Wahrheitswerte auswählt und falsche Werte zurückweist. Die Underscore-Bibliothek enthält auch eine Reihe anderer Prädikate. Beispielsweise würde _.pick(sourceObj, _.isBoolean) nur boolesche Eigenschaften beibehalten.

Wenn Sie diese Technik häufig verwenden, möchten Sie sie vielleicht etwas ausdrucksvoller machen:

var pickNonfalsy = _.partial(_.pick, _, _.identity); // Place this in a library module or something
pickNonfalsy(sourceObj);

In der Unterstreichung Version 1.6.0 wurde ebenfalls _.pick bereitgestellt, jedoch wurde keine Prädikatsfunktion anstelle einer Whitelist akzeptiert.

166
Emil Lundberg

Schnell und klar: _.omit( source, i => !i );

Dies wird umgekehrt zu Emil's Antwort gesagt. Auf diese Weise liest sich imho klarer; es ist selbsterklärend.

Etwas weniger sauber, wenn Sie nicht den Luxus von ES6 haben: _.omit( source, function(i){return !i;}); 

Alternative: _.omit( source, _.isEmpty)

Wenn Sie_.isEmptyanstelle von _.identity für Wahrhaftigkeit verwenden, /, werden auch leere Arrays und Objekte aus der Sammlung entfernt und möglicherweise Zahlen und Datumsangaben unzweckmäßig entfernt . Daher ist das Ergebnis NICHT eine exakte Antwort auf die Frage des OP. Es kann jedoch nützlich sein, wenn leere Sammlungen entfernt werden sollen.

43
Shwaydogg

Mit lodash's transform ,

_.transform(obj, function(res, v, k) {
  if (v) res[k] = v;
});
21
raine
Object.keys(o).forEach(function(k) {
    if (!o[k]) {
        delete o[k];
    }
});
17

Sie können einen flachen Klon erstellen:

_(obj).reduce(function(a,v,k){ 
     if(v){ a[k]=v; } 
     return a; 
},{});
9
webwise

für Objekt verwenden löschen.

for(var k in obj){

  if(obj.hasOwnProperty(k) && !obj[k]){
    delete obj[k];
  }
}
5
Anoop

Plötzlich musste ich eine Funktion erstellen, um rekursive Fehler zu entfernen. Ich hoffe das hilft. Ich benutze Lodash.

var removeFalsies = function (obj) {
    return _.transform(obj, function (o, v, k) {
        if (v && typeof v === 'object') {
            o[k] = _.removeFalsies(v);
        } else if (v) {
            o[k] = v;
        }
    });
};

_.mixin({ 'removeFalsies': removeFalsies });

Dann kannst du es benutzen:

var o = _.removeFalsies({
  foo: 'bar',
  a: 0,
  b: false,
  c: '',
  d: null,
  e: undefined,
  obj: {
    foo: 'bar',
    a: 0,
    b: false,
    c: '',
    d: null,
    e: undefined
  }
});

// {
//   foo: 'bar',
//   obj: {
//     foo: 'bar'
//   }
// }
4
Marco Godínez

So fügen Sie gion_13s Antwort hinzu:

_.mixin({
  compactObject : function(o) {
     var newObject = {};
     _.each(o, function(v, k) {
       if(v !== null && v !== undefined) {
         newObject[k] = v
       }
     });
     return newObject;
  }
});

Dieser erstellt ein neues Objekt und fügt Schlüssel und Werte hinzu, anstatt alles zu klonen und Schlüssel-Wert-Paare zu löschen. Kleiner Unterschied.

Wichtiger ist jedoch, dass explizit nach null und undefined anstelle von falsey gesucht wird, wodurch Schlüssel-Wert-Paare gelöscht werden, die den Wert false haben.

1
Geoff Lee

im lodash gefällt dir das:

_.pickBy(object, _.identity);
0
Hydrogen