为了账号安全,请及时绑定邮箱和手机立即绑定

递归过滤/减少嵌套对象

递归过滤/减少嵌套对象

MYYA 2021-05-03 21:49:47
我有一个深度嵌套的对象,需要搜索以删除某些键。要删除的密钥存储在阵列中指示的removeKeys阵列中。当前,该函数仅过滤顶级对象,但将其余部分按比例缩放,只是不过滤子对象。如何适当缩小整个对象以获得所需的输出?初始未过滤的对象:let item = {            "label": "test",            "id": "test",            "styles": {                "label": "Styles",                "styles": {                    "test": {                        "test": "test",                        "label": "test",                        "test1": {                            "label": "test",                            "image": {                                "label": "test",                                "type": "test",                                "value": "test",                                "autoSelect": "",                                "id": ""                            }                        }                    }                }            },            "test": {                "label": "test",                "test": []            }        }要从对象中删除的键:const removeKeys = ["label", "type", "autoSelect"];递归函数用于过滤嵌套对象:let filterObject = filterNestObject(item);function filterNestObject(item) {  return Object.keys(item)  .filter(key => {    if (typeof item[key] === 'object') filterNestObject(item[key]);    if (!removeKeys.includes(key)) return true;    return false   })    .reduce((object, key) => {    return {      ...object,      [key]: item[key]    };  }, {});}预期结果将是:{            "id": "test",            "styles": {                "styles": {                    "test": {                        "test": "test",                        "test1": {                            "image": {                                "value": "test",                                "id": ""                            }                        }                    }                }            },            "test": {                "test": []            }        }
查看完整描述

3 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

这有点hacky,性能也不是很好,所以如果您要处理非常大的对象图,这可能不是一个好的解决方案,但这是在以下方法中使用replacer回调的单线解决方案JSON.stringify:


JSON.parse(JSON.stringify(audience, (k, v) => removeKeys.includes(k) ? undefined : v));

演示:


let audience = {

  "label": "test",

  "id": "test",

  "styles": {

    "label": "Styles",

    "styles": {

      "test": {

        "test": "test",

        "label": "test",

        "test1": {

          "label": "test",

          "image": {

            "label": "test",

            "type": "test",

            "value": "test",

            "autoSelect": "",

            "id": ""

          }

        }

      }

    }

  },

  "test": {

    "label": "test",

    "test": []

  }

}

const removeKeys = ["label", "type", "autoSelect"];

let newAudience = JSON.parse(JSON.stringify(audience, (k, v) => removeKeys.includes(k) ? undefined : v));

console.log(newAudience);

同样,如果您要从JSON字符串解析原始对象,则可以使用reviver来自的回调JSON.parse:


let jsonString = `{

  "label": "test",

  "id": "test",

  "styles": {

    "label": "Styles",

    "styles": {

      "test": {

        "test": "test",

        "label": "test",

        "test1": {

          "label": "test",

          "image": {

            "label": "test",

            "type": "test",

            "value": "test",

            "autoSelect": "",

            "id": ""

          }

        }

      }

    }

  },

  "test": {

    "label": "test",

    "test": []

  }

}`

const removeKeys = ["label", "type", "autoSelect"];

const audience = JSON.parse(jsonString, (k, v) => removeKeys.includes(k) ? undefined : v);

console.log(audience);


查看完整回答
反对 回复 2021-05-13
  • 3 回答
  • 0 关注
  • 175 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信