Javascript 过滤空对象属性

标签 javascript

我有一个包含一个或多个对象的数组,我想过滤掉所有空属性:

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


但是我得到了相同的对象属性。我错过了什么?

最佳答案

听起来您想用新对象创建一个新数组,这些新对象只具有不属于 null 的属性。从原文。是这样,map是你想开始的地方,但是 Object.keys(el)总是真实的,因为它返回一个属性名称数组。你虽然很接近:

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?



if (Object.keys(el))总是真实的,你的代码总是返回 el不变。它不是创建新对象,也不是使用 null 删除属性原始对象的值。

以上创建了新对象,但如果您愿意,您可以从具有 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);


但是,有两个方面需要指出:
  • 它修改了原始对象(因此,在某种程度上,原始数组)。
  • 当您从对象中删除属性时,它可能会影响之后对该对象的属性查找性能。 99.999% 的时间你不在乎,但它就在那里。
  • 关于Javascript 过滤空对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41828787/

    相关文章:

    javascript - 在 Concrete5 中编辑 block

    javascript - 从 select 标签内的 ng-change 中的选项获取 $index

    javascript - PHP:如何将 foreach 数组索引 $key 计数更改为 1 而不是 0

    javascript - 从字符串中剥离 ID

    javascript - 如何在 volusion 站点中添加滚动到顶部的 float 按钮?

    javascript - 如何使用纯 javascript 为嵌套在带有 id 的 div 中的 a-tags 设置样式

    javascript - 样板文件和权限

    javascript - 为什么进度条不加载?

    javascript - 当用户单击 Button.1 时打开移动设备的 map

    javascript - `$getjson` 从 Django 到 javascript 不起作用