如何过滤未定义值的对象数组?

时间:2015-05-26 19:46:57

标签: javascript arrays object underscore.js lodash

我有以下数组:

[{object}, {object}, {object}]

每个对象看起来像:

{key0: 3, key1: undefined, key2: 7}

我想过滤未定义属性的数组,以便数组中的每个对象现在看起来像:

{key0: 3, key2: 7}

我用Lo_Dash尝试了一切,我想我一定是疯了。

4 个答案:

答案 0 :(得分:2)

你现在写了什么代码?

你可以这样做:

_.each(array, function(item, index, collection){
  collection[index] = _.filter(item, function(value){
    return value !== undefined;
  });
});

这将迭代数组,然后过滤数组中的每个对象。

编辑:

如果您想将数组元素维护为对象,则可以使用_.reduce。 IE:

_.each(array, function(item, index, collection){
  collection[index] = _.reduce(item, function(result, value, key){
    if(value !== undefined) { result[key] = value; }
    return result;
  }, {});
});

答案 1 :(得分:1)

在LoDash中,您可以使用map + omit

的组合
objs = _.map(objs, function(x) {
    return _.omit(x, _.isUndefined)
})

答案 2 :(得分:0)

您可以使用“delete”关键字遍历所有属性并删除未定义的属性。

var myObj = {key0: 3, key1: undefined, key2: 7};

for (var i in myObj) {
  if (myObj[i] === undefined) {
    delete myObj[i];
  }
}

答案 3 :(得分:0)

这是我要采取的方法。在数组上使用filter并检查循环中所有未定义的道具。然后只需从对象中删除它们即可。我只是看了,另一张海报注意到了这一点我也包括了hasOwnProperty检查。

var data = [{
    key0: 3,
    key1: undefined,
    key2: 7
}, {
    key0: 4,
    key1: undefined,
    key2: 8
}, {
    key0: 5,
    key1: undefined,
    key2: 9
}];

function removeUndefined(obj) {
    for (var prop in obj) {
        if (obj.hasOwnProperty(prop) && obj[prop] === undefined) {
            // do stuff
           delete obj[prop];
        }
    }
    return obj;
}

var filtered = data.filter(removeUndefined);

console.log(filtered);