7

以下のようなツリー オブジェクトがあり、空の場合は項目配列プロパティを削除しようとしています。これを行うための最良のアプローチがわかりませんか?

キーをループし、プロパティを確認してから削除することを考えて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 に答える