【问题标题】:How can I remove empty object in from an array in JS如何从JS中的数组中删除空对象
【发布时间】:2016-02-26 07:49:36
【问题描述】:

我有一个对象数组,当我字符串化时,它看起来像这样:

"[[{"entrReqInv": "Neither"},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}]]"

如何删除空的{}s?

【问题讨论】:

  • @jfriend00 我编辑了问题以反映正确的 JS 对象语法。

标签: javascript jquery arrays


【解决方案1】:
var newArray = array.filter(value => Object.keys(value).length !== 0);

【讨论】:

  • 就是这样!箭头函数使数组方法更易于阅读 imo。
  • 我同意,但你应该给它一个提示,并添加一个 es5 示例,因为它可能无法在任何地方工作..
  • array.filter((item) => Object.keys(item).length);
  • @Sinux 答案很好,但请记住,在数组上调用 filter() 不会更改原始数组,因此您必须重新分配它,例如array = array.filter((item) => Object.keys(item).length);
  • 如果数组包含未定义的对象,这将不起作用。即 [{name:"abc"}, undefined ].
【解决方案2】:

您可以在字符串化之前使用Array.prototype.filter 删除空对象。

JSON.stringify(array.filter(function(el) {
    // keep element if it's not an object, or if it's a non-empty object
    return typeof el != "object" || Array.isArray(el) || Object.keys(el).length > 0;
});

【讨论】:

  • 这也会过滤掉空数组。
  • @Roamer-1888 有没有办法将数组与其他对象区分开来?无论如何,他说他有一个对象数组,这可能无关紧要。
  • 确实,我们不知道这是否重要。如果是,则将Array.isArray(el) 添加到过滤器中。
  • 不是真正向后兼容,但仍然是一个解决方案。
  • 谢谢你们!!它终于对我有用了!!!我真的应该上传一张照片......它是她 :) thxs 的帮助
【解决方案3】:

我建议使用以下代码:

var newArray = array.filter(value => JSON.stringify(value) !== '{}');

我没有使用 Object.keys(value).length !== 0 因为它不仅会删除空对象 { } 还会删除空数组 []。如果你只想删除空对象,使用上面的方法。

【讨论】:

    【解决方案4】:

    如果你的对象数组是这样的 -

    finalobj--- [ { 'patient._id': '123' },
      { 'patient.birthDate': 'lt2013-01-14', {}, {} } ]
    

    然后使用下面的行删除空白对象--

    var newArray = obj.filter((value: {}) => Object.keys(value).length !== 0);
    

    【讨论】:

      【解决方案5】:

      更容易理解:

      let primaryArray = [{key:'value'},{},{},{}]
      let removeObsoletesArray = []
      primaryArray.forEach( element => {
         if(element.length > 0){
            removeObsoletesArray.push(element)
         }
      })
      

      【讨论】:

      • 如果你这样做,这将起作用:Object.keys(dictionary).length.
      【解决方案6】:

      出于渐进增强的原因,我会这样做:

      var aryAry = [[{prop: 'value'},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}]];
      var a = aryAry[0], r = [];
      for(var i=0,l=a.length; i<l; i++){
        var n = 0, o = a[i];
        for(var q in o){
          n++;
        }
        if(n > 0){
          r.push(o);
        }
      }
      console.log(r);
      

      【讨论】:

      • 您对splice() 的参数有误,应该是(i, 1)。但这也会跳过你拼接出来的那个元素,因为那个元素会变成i
      • 也不清楚他要修改数组本身,只是字符串化时不包含空元素。
      • 内部循环对n = Object.keys(o).length;来说是一种非常冗长的方法
      • 我早就不再担心IE8了。如果他需要 polyfill,他可以查找。
      • 根据this,您今年失去了超过 14% 的市场份额。
      【解决方案7】:
      const arrValues = [{
        x: 100
      }, {
        x: 200
      }, {}];
      let filteredArra = arrValues.filter(
        obj => !(obj && Object.keys(obj).length === 0)
      );
      

      【讨论】:

        【解决方案8】:

        let arr = [{a:1},{},{c:3}];
        
        arr = _.filter(arr,v => _.keys(v).length !== 0);
        
        console.log(arr)
        &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"&gt;&lt;/script&gt;

        arr= _.filter(arr,v => _.keys(v).length !== 0);

        【讨论】:

        • 您可能还需要添加关于答案的说明
        • 嗨,欢迎来到 Stack Overflow。在回答已经有几个答案的问题时,请务必添加一些额外的见解,说明为什么您提供的回复是实质性的,而不是简单地回应原始发帖人已经审查过的内容。这在您提供的“纯代码”答案中尤其重要。
        猜你喜欢
        • 2021-01-04
        • 2016-11-26
        • 2022-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-02
        相关资源
        最近更新 更多