简体   繁体   English

Javascript过滤空对象属性

[英]Javascript filter null object properties

I have an Array with one or more objects and I want to filter out all null properties: 我有一个包含一个或多个对象的数组,我想过滤掉所有空属性:

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

But I get the same object properties back. 但我得到了相同的对象属性。 What am I missing? 我错过了什么?

It sounds like you want to create a new array with new objects that only have the properties that aren't null from the original. 听起来您想要创建一个新数组,其中新对象的属性与原始属性不为null Is so, map is where you want to start, but Object.keys(el) is always truthy, since it returns an array of property names. 是这样, map是你想要开始的地方,但是Object.keys(el)总是很简单,因为它返回一个属性名称数组。 You're close though: 你虽然很近:

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

What am I missing? 我错过了什么?

Since if (Object.keys(el)) is always truthy, your code was just always returning el unchanged. 因为if (Object.keys(el))总是很简单,所以你的代码总是返回el不变。 It wasn't creating a new object, or deleting properties with null values from the original object. 它不是创建新对象,也不是从原始对象中删除具有null值的属性。

The above creates new objects, but if you like, you can just delete properties from the originals that have null values instead: 上面创建了新对象,但是如果您愿意,可以从具有null值的原始文件中删除属性:

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

Two aspects of that to call out, though: 然而,要提出的两个方面是:

  • It modifies the original objects (and thus, in a way, the original array). 它修改原始对象(因此,在某种程度上,修改原始数组)。
  • When you delete a property from an object, it can have an impact on the performance of property lookup on that object afterward. 从对象中删除属性时,它可能会影响该对象上的属性查找性能。 99.999% of the time you don't care, but it's there. 99.999%的时间你不在乎,但它就在那里。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM