【问题标题】:How do you filter an array of objects for undefined values?如何过滤对象数组中未定义的值?
【发布时间】:2015-05-26 19:46:56
【问题描述】:

我有以下数组:

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

每个对象看起来像:

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

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

{key0: 3, key2: 7}

我用 Lo_Dash 尝试了所有方法,我想我一定要疯了。

【问题讨论】:

    标签: javascript arrays object underscore.js lodash


    【解决方案1】:

    你现在写了什么代码?

    你可以这样做:

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

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

    编辑:

    如果您想将数组元素作为对象来维护,您可以使用 _.reduce 代替。即:

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

    【讨论】:

    • 我试过这个。它肯定会取出未定义的值,但它也会将我的对象数组重新格式化为数组数组;我需要将已定义值的键值对保留为键值对。
    • 啊,我明白了,然后用_.reduce 代替_.filter 试试。查看我的编辑。
    • 很好的解决方案! Reduce 确实很有帮助,但对于我们这些不知情的人来说却没有得到充分利用。 . .我最近想出了一个用 reduce 连接数组的解决方案:stackoverflow.com/questions/5080028/… 关于函数式编码,我还有很多东西要学
    【解决方案2】:

    这是我将采取的方法。在您的数组上使用 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);
    

    【讨论】:

      【解决方案3】:

      在 LoDash 中,您可以使用 map + omit 的组合:

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

      【讨论】:

        【解决方案4】:

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

        var myObj = {key0: 3, key1: undefined, key2: 7};
        
        for (var i in myObj) {
          if (myObj[i] === undefined) {
            delete myObj[i];
          }
        }

        【讨论】:

        • 在循环对象时,您通常应该使用hasOwnProperty 检查,但我想这真的取决于 OP。
        • 谢谢各位!我现在正在尝试您的解决方案。稍后会跟进
        • 我与您为 LoDash 提供的版本相似,但在使用严格模式时似乎无法使用 delete 关键字。除了关闭严格模式限制之外,还有什么解决方案吗?
        猜你喜欢
        • 2016-07-15
        • 1970-01-01
        • 2019-12-13
        • 2021-01-30
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 2021-05-02
        • 2020-04-07
        相关资源
        最近更新 更多