JavaScript递归遍历多维对象数组时如何保留update_history层级?
问题
现有如下变量:
let obj = { "aff_link": "https://event.2performant.com/events/click?ad_type=product_store&unique=83b281931&aff_code=d79aaed64&campaign_unique=2e49eab4f", "availability": true, "brand": "Casio", "date_add": 1666792631, "date_upd": 1666792631, "id": 78594, "price": 159.24, "product_type": "Ceasuri de mana", "title": "Ceas Casio CLASSIC LTP-1303L-7BVEF", "update_history": [ { "id_feed": 108, "date_upd": 1666794541, "address" : [ { "present" : "Dhanmondi 15", "permanent" : "Gulshan 2" } ] } ], "vgt_id": 0, "originalIndex": 0 };
同时定义空数组:
let arr = [];
使用以下递归函数遍历obj的所有属性并存储到arr中:
function eachRecursive(obj) { for (var k in obj) { if( k !== 'additional_image_link' ) { if (typeof obj[k] == "object" && obj[k] !== null) { eachRecursive(obj[k]); } else { arr.push({ [k] : obj[k] }) } } } }
执行console.log(arr)后得到如下输出:
[ { aff_link: 'https://event.2performant.com/events/click?ad_type=product_store&unique=83b281931&aff_code=d79aaed64&campaign_unique=2e49eab4f' }, { availability: true }, { brand: 'Casio' }, { date_add: 1666792631 }, { date_upd: 1666792631 }, { id: 78594 }, { price: 159.24 }, { product_type: 'Ceasuri de mana' }, { title: 'Ceas Casio CLASSIC LTP-1303L-7BVEF' }, { id_feed: 108 }, { date_upd: 1666794541 }, { present: 'Dhanmondi 15' }, { permanent: 'Gulshan 2' }, { vgt_id: 0 }, { originalIndex: 0 } ]
可以看到输出中缺少update_history这个键,需要修改函数,让输出中包含update_history作为键,其值保留完整的嵌套结构(包含id_feed、date_upd、present、permanent及对应取值),同时保留原有的叶子节点项。
解决方案
原函数的问题在于:遇到值为对象/数组的属性时,直接递归处理内部元素,没有将当前属性的键值对(比如update_history及其对应数组)加入数组。
修改思路:先将当前属性的键值对加入数组,再判断如果值是对象/数组且不为null,就递归处理其内部元素。这样既能保留父级属性(如update_history),也能继续遍历子元素。
修改后的函数代码:
function eachRecursive(obj) { for (var k in obj) { if( k !== 'additional_image_link' ) { // 先把当前键值对加入数组 arr.push({ [k]: obj[k] }); // 如果值是对象/数组且不为null,递归处理内部元素 if (typeof obj[k] === "object" && obj[k] !== null) { eachRecursive(obj[k]); } } } }
执行修改后的函数后,arr中会新增{ update_history: [...] }这一项,同时保留原有的所有叶子节点项,满足需求。
内容的提问来源于stack exchange,提问作者Shibbir
相关产品推荐
相关产品推荐

