You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 16:10:36