7

我有一个如下的树对象,如果它是空的,我正在尝试删除 items 数组属性。我不确定执行此操作的最佳方法?

我正在考虑遍历密钥,检查属性,然后使用删除delete myJSONObject[prop]...欢迎任何想法/想法?

[{
    text: "TreeRoot",
    items: [{
        text: "Subgroup1",
        items: []
    }, {
        text: "Subgroup2",
        items: []
    }, {
        text: "Subgroup3",
        items: [],
        items: [{
            text: "subgroup5",
            items: [{
                text: "subgroup6",
                items: [{
                    text: "subgroup7",
                    items: [{
                        text: "subgroup8",
                        items: []
                    }]
                }]
            }]
        }]
    }]
}]
4

4 回答 4

3

这应该可以完成工作(ES5):

function removeEmpty(obj) {
  Object.keys(obj).forEach(function(key) {
    (key === 'items' && obj[key].length === 0) && delete obj[key] ||
    (obj[key] && typeof obj[key] === 'object') && removeEmpty(obj[key])
  });
  return obj;
};

JSBIN

ES6中相同:

const removeEmpty = (obj) => {
  Object.keys(obj).forEach(key =>
    (key === 'items' && obj[key].length === 0) && delete obj[key] ||
    (obj[key] && typeof obj[key] === 'object') && removeEmpty(obj[key])
  );
  return obj;
};

JSBIN

于 2016-07-14T02:57:56.597 回答
1

您可以使用递归算法,在每个步骤中删除items数组并返回,或递归处理数组的每个单独对象。

我也会尝试在服务器端执行此操作。它将节省大量复杂性、内存和处理时间。通常有一些方法可以从 JSON 编码的字符串中“排除”空数组。

于 2013-01-15T18:30:54.393 回答
0

这个老问题已经被提出来了,我认为现代 JS 与递归配合得很好,可以产生一个简单的答案,以不可变的方式做到这一点:

const removeEmptyItems = (xs) =>
   xs .map (({items = [], ... rest}) => ({
    ... rest, 
    ... (items .length ? {items: removeEmptyItems(items)} : {})
  }))

const tree = [{text: "TreeRoot", items: [{text: "Subgroup1", items: []}, {text: "Subgroup2", items: []}, {text: "Subgroup3",items: [{text: "subgroup5", items: [{text: "subgroup6", items: [{text: "subgroup7", items: [{text: "subgroup8", items: []}]}]}]}]}]}]

console .log (removeEmptyItems (tree))
.as-console-wrapper {max-height: 100% !important; top: 0}

这个函数简单地映射数组,保留每个对象的其余部分,并为其items属性,当它为空时跳过它,当它不是时重复。

我不得不说,当第一次问这个问题时,这个答案看起来很陌生!现在它只是普通的JS!

于 2021-01-07T03:19:26.390 回答
0

这是使用对象扫描的解决方案

// const objectScan = require('object-scan');

const data = [{ text: 'TreeRoot', items: [{ text: 'Subgroup1', items: [] }, { text: 'Subgroup2', items: [] }, { text: 'Subgroup3', items: [{ text: 'subgroup5', items: [{ text: 'subgroup6', items: [{ text: 'subgroup7', items: [{ text: 'subgroup8', items: [] }] }] }] }] }] }];

const modify = (obj) => objectScan(['**.items'], {
  rtn: 'count',
  filterFn: ({ value, parent, property }) => {
    if (Array.isArray(value) && value.length === 0) {
      delete parent[property];
      return true;
    }
    return false;
  }
})(obj);

console.log(modify(data)); // returns number of deletions
// => 3
console.log(data);
// => [ { text: 'TreeRoot', items: [ { text: 'Subgroup1' }, { text: 'Subgroup2' }, { text: 'Subgroup3', items: [ { text: 'subgroup5', items: [ { text: 'subgroup6', items: [ { text: 'subgroup7', items: [ { text: 'subgroup8' } ] } ] } ] } ] } ] } ]
.as-console-wrapper {max-height: 100% !important; top: 0}
<script src="https://bundle.run/object-scan@13.7.1"></script>

免责声明:我是对象扫描的作者

于 2020-12-27T06:52:35.543 回答