2017-01-24 3 views
1

Ich habe ein Array mit einem oder mehreren Objekten, und ich möchte alle null Eigenschaften herauszufiltern:Javascript Filter null Objekteigenschaften

asset = [{"ObjId":177791,"ObjCreditlineM":"DEU","ObjReprorechtM":null,"ObjKommentarM":null,"ObjZustandM":null,"ObjReserve01M":null,"ObjReserve02M":null,"ObjFeld01M":null,"ObjFeld02M":null,"ObjFeld03M":null,"ObjFeld04M":"Foto","ObjFeld05M":null,"ObjFeld06M":null,"ObjFeld07M":null,"ObjFeld01S":null,"ObjFeld02S":null,"ObjFeld03S":null,"ObjFeld04S":null,"ObjFeld05S":null,"ObjFeld06S":null,"ObjFeld07S":null,"ObjFeld01F":0,"ObjFeld02F":0,"ObjFeld01D":null,"ObjFeld02D":null,"ObjInv01S":null,"ObjInv02S":null,"ObjInv03S":null,"ObjInv04S":null,"ObjInv05S":null,"ObjInv06S":null,"ObjDinId":0,"ObjReferenz01Id":null,"ObjReferenz02Id":null,"ObjTransferId":null,"ObjGesperrtS":null,"ObjIconTextM":null}] 
 

 

 
// My attempt: 
 

 
var filledProps = asset.map(el => { 
 
    if (Object.keys(el)) { // check if object property value is not null 
 
    return el; 
 
    }; 
 
}); 
 

 
console.log(filledProps);

Aber ich bekomme die gleichen Objekteigenschaften zurück. Was vermisse ich?

Antwort

3

Es klingt wie Sie ein neues Array mit neuen Objekten erstellen möchten, die nur die Eigenschaften haben, die nicht null aus dem Original sind. Ist das so, map ist, wo Sie starten möchten, aber Object.keys(el) ist immer truthy, da es ein Array von Eigenschaftsnamen zurückgibt. Sie sind in der Nähe aber:

var asset = [{"ObjId":177791,"ObjCreditlineM":"DEU","ObjReprorechtM":null,"ObjKommentarM":null,"ObjZustandM":null,"ObjReserve01M":null,"ObjReserve02M":null,"ObjFeld01M":null,"ObjFeld02M":null,"ObjFeld03M":null,"ObjFeld04M":"Foto","ObjFeld05M":null,"ObjFeld06M":null,"ObjFeld07M":null,"ObjFeld01S":null,"ObjFeld02S":null,"ObjFeld03S":null,"ObjFeld04S":null,"ObjFeld05S":null,"ObjFeld06S":null,"ObjFeld07S":null,"ObjFeld01F":0,"ObjFeld02F":0,"ObjFeld01D":null,"ObjFeld02D":null,"ObjInv01S":null,"ObjInv02S":null,"ObjInv03S":null,"ObjInv04S":null,"ObjInv05S":null,"ObjInv06S":null,"ObjDinId":0,"ObjReferenz01Id":null,"ObjReferenz02Id":null,"ObjTransferId":null,"ObjGesperrtS":null,"ObjIconTextM":null}] 
 

 
// Use `map` to get a new array with new objects 
 
var filledProps = asset.map(el => { 
 
    // Loop the property names of `el`, creating a new object 
 
    // with the ones whose values aren't `null`. 
 
    // `reduce` is commonly used for doing this: 
 
    return Object.keys(el).reduce((newObj, key) => { 
 
    const value = el[key]; 
 
    if (value !== null) { 
 
     newObj[key] = value; 
 
    } 
 
    return newObj; 
 
    }, {}); 
 
}); 
 
console.log(filledProps);

Was bin ich?

Seit if (Object.keys(el)) ist immer truthy, wurde der Code nur immer el unverändert zurück. Es wurde kein neues Objekt erstellt oder Eigenschaften mit null Werten aus dem ursprünglichen Objekt gelöscht.

Die obige neue Objekte erstellt werden, aber wenn Sie möchten, können Sie einfach löschen Eigenschaften von den Originalen, die null Werte stattdessen haben:

var asset = [{"ObjId":177791,"ObjCreditlineM":"DEU","ObjReprorechtM":null,"ObjKommentarM":null,"ObjZustandM":null,"ObjReserve01M":null,"ObjReserve02M":null,"ObjFeld01M":null,"ObjFeld02M":null,"ObjFeld03M":null,"ObjFeld04M":"Foto","ObjFeld05M":null,"ObjFeld06M":null,"ObjFeld07M":null,"ObjFeld01S":null,"ObjFeld02S":null,"ObjFeld03S":null,"ObjFeld04S":null,"ObjFeld05S":null,"ObjFeld06S":null,"ObjFeld07S":null,"ObjFeld01F":0,"ObjFeld02F":0,"ObjFeld01D":null,"ObjFeld02D":null,"ObjInv01S":null,"ObjInv02S":null,"ObjInv03S":null,"ObjInv04S":null,"ObjInv05S":null,"ObjInv06S":null,"ObjDinId":0,"ObjReferenz01Id":null,"ObjReferenz02Id":null,"ObjTransferId":null,"ObjGesperrtS":null,"ObjIconTextM":null}]; 
 

 
asset.forEach(el => { 
 
    Object.keys(el).forEach(key => { 
 
    if (el[key] === null) { 
 
     delete el[key]; 
 
    } 
 
    }); 
 
}); 
 
console.log(asset);

Zwei Aspekte davon zu rufen, though:

  • Es ändert die ursprünglichen Objekte (und damit in gewisser Weise das ursprüngliche Array).
  • Wenn Sie eine Eigenschaft aus einem Objekt löschen, kann sich dies später auf die Leistung der Eigenschaftensuche für dieses Objekt auswirken. 99.999% der Zeit ist dir egal, aber es ist da.
+0

Danke, habe ich viel gelernt von Ihrer Antwort! – StandardNerd

1

asset = [{"ObjId":177791,"ObjCreditlineM":"DEU","ObjReprorechtM":null,"ObjKommentarM":null,"ObjZustandM":null,"ObjReserve01M":null,"ObjReserve02M":null,"ObjFeld01M":null,"ObjFeld02M":null,"ObjFeld03M":null,"ObjFeld04M":"Foto","ObjFeld05M":null,"ObjFeld06M":null,"ObjFeld07M":null,"ObjFeld01S":null,"ObjFeld02S":null,"ObjFeld03S":null,"ObjFeld04S":null,"ObjFeld05S":null,"ObjFeld06S":null,"ObjFeld07S":null,"ObjFeld01F":0,"ObjFeld02F":0,"ObjFeld01D":null,"ObjFeld02D":null,"ObjInv01S":null,"ObjInv02S":null,"ObjInv03S":null,"ObjInv04S":null,"ObjInv05S":null,"ObjInv06S":null,"ObjDinId":0,"ObjReferenz01Id":null,"ObjReferenz02Id":null,"ObjTransferId":null,"ObjGesperrtS":null,"ObjIconTextM":null}] 
 

 

 
// My attempt: 
 

 
var filledProps = asset.map(el => { 
 
    var obj = {}; 
 
    for(var prop in el){ 
 
     if(el[prop] !== null) 
 
      obj[prop] = el[prop]; 
 
    } 
 

 
    return obj; 
 
}); 
 

 
console.log(filledProps);

Verwandte Themen