【问题标题】:How to remove object from array if property in object do not exist如果对象中的属性不存在,如何从数组中删除对象
【发布时间】:2018-07-16 17:52:57
【问题描述】:

我有以下数据集

[{
 id: '1',
 date: '2017-01-01',
 value: 2
 },
 {
 id: '2',
 date: '2017-01-02',
 value: 3
 },
 {
 id: '3',
 value: 3
 },
 id: '4',
 date: '2017-01-02',
 value: 3
 }]

我想删除任何没有“日期”属性的对象。在上面的例子中,id 为 3 的对象应该被删除。

完成的对象应该是这样的

[{
 id: '1',
 date: '2017-01-01',
 value: 2
 },
 {
 id: '2',
 date: '2017-01-02',
 value: 3
 },
 id: '4',
 date: '2017-01-02',
 value: 3
 }]

我尝试使用 lodash 查找并删除未定义的值。这没用。对象看起来与进入时完全一样。

  _.each(obj, (val) => {
    _.remove(val, value => value['XXX-BUDAT'] === undefined);
   });

我如何使用 lodash 来实现这个目的?

提前致谢

【问题讨论】:

    标签: javascript arrays lodash


    【解决方案1】:

    您可以使用.filter()Object.keys().includes()

    let input = [
       { id: '1', date: '2017-01-01', value: 2},
       { id: '2', date: '2017-01-02', value: 3},
       { id: '3', value: 3 },
       { id: '4', date: '2017-01-02', value: 3 }
    ]
     
     let output = input.filter(obj => Object.keys(obj).includes("date"));
     
     console.log(output);

    【讨论】:

    • 啊好的。而不是删除您使用包含日期的键创建和对象。很好,谢谢你,米克尔
    • @Ckappo 如果这对您有用,请upvote 这个问题供未来的读者参考,如果您认为这是最适合您问题的问题,请考虑accepting
    • @mickl 使用Object.hasOwnProperty 可能更有意义,不是吗?这样您就不必生成 + 迭代对象键集合。
    【解决方案2】:

    您可以使用Array#filterObject#hasOwnProperty 这样做:

    var newArray = oldArray.filter(function(obj) {
        return obj.hasOwnProperty("date");
    });
    

    可以使用箭头函数缩短:

    var newArray = oldArray.filter(obj => obj.hasOwnProperty("date"));
    

    Lodash 解决方案:

    var newArray = _.filter(oldArray, obj => _.has(obj, "date"));
    

    示例:

    var oldArray = [{id: '1', date: '2017-01-01', value: 2 }, { id: '2', date: '2017-01-02', value: 3 }, { id: '3', value: 3 }, {id: '4', date: '2017-01-02', value: 3}];
    
    var newArray = oldArray.filter(obj => obj.hasOwnProperty("date"));
    
    console.log(newArray);

    【讨论】:

      【解决方案3】:

      您可以像这样filter 基于该属性的数组:

      const initial = [{
          id: '1',
          date: '2017-01-01',
          value: 2
        },
        {
          id: '2',
          date: '2017-01-02',
          value: 3
        },
        {
          id: '3',
          value: 3
        }, { // this left curly brace was missing!, check that out
          id: '4',
          date: '2017-01-02',
          value: 3
        }
      ];
      
      const finalR = initial.filter((obj) => obj.hasOwnProperty('date') && !!obj.date);
      
      console.log(finalR);

      【讨论】:

      • 请注意,这可能会导致问题,因为它也会查找原型链。
      • 我不知道为什么我之前的评论被删除了......无论如何。 ibrahim mahrir 评论后更新答案
      【解决方案4】:

      您可以使用Array.prototype.filter。另外,你可以使用 ES6 对象赋值析构使其简洁:

      var data=[{id:'1',date:'2017-01-01',value:2},{id:'2',date:'2017-01-02',value:3},{id:'3',value:3},{id:'4',date:'2017-01-02',value:3}];
      
      var result = data.filter(({date}) => date);
      
      console.log(result)
      

      【讨论】:

        【解决方案5】:

        首先,您的对象数组无效,通过用前面的花括号 { 包裹最后一个对象元素来修复它。请参阅Array.prototype.filter()Object.prototype.hasOwnProperty(),这将检查您当前的对象项是否具有date 键?如果有,那么它将返回该对象,否则该项目将不会返回。

        var array_of_object = [{
            id: '1',
            date: '2017-01-01',
            value: 2
          },
          {
            id: '2',
            date: '2017-01-02',
            value: 3
          },
          {
            id: '3',
            value: 3
          },
          { //missing brace here
            id: '4',
            date: '2017-01-02',
            value: 3
          }
        ];
        
        
        function filterByValue(item) {
          return item.hasOwnProperty('date');
        }
        var arrByID = array_of_object.filter(filterByValue);
        console.log(arrByID);

        【讨论】:

          【解决方案6】:

          这是一个原生 javascript 解决方案:

          var arr = [
            {id: '1', date: '2017-01-01', value: 2},
            {id: '2', date: '2017-01-02', value: 3},
            {id: '3', value: 3},
            {id: '4', date: '2017-01-02', value: 3}
          ]
          
          for(var i = 0; i < arr.length; i++) {
            if(!arr[i].hasOwnProperty("date")) {
              arr.splice(i,1);
            }
          }
          
          console.log(arr);

          【讨论】:

          • 请注意,这可能会导致问题,因为它也会查找原型链。见this comment;在我第一次尝试回答这个问题时,我也省略了这一点:) 一个解决方案可能是使用hasOwnProperty func。
          猜你喜欢
          • 1970-01-01
          • 2021-01-30
          • 2018-07-01
          • 2015-04-08
          • 2021-09-29
          • 2013-05-05
          • 2011-05-09
          • 1970-01-01
          • 2016-09-10
          相关资源
          最近更新 更多