递归过滤/减少嵌套对象

我有一个深度嵌套的对象,需要搜索以删除某些键。要删除的密钥存储在阵列中指示的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": []

            }

        }


MYYA
浏览 176回答 3
3回答

HUX布斯

这有点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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript