遍历递归结构并将数据添加到倒数第二个节点

Traverse a recursive structure and add data to second last node

本文关键字:倒数 倒数第二 第二个 节点 添加 数据 递归 结构 遍历      更新时间:2023-09-26

我有一个对象

x =    {
            "y": 55.11,
            "color": "#4572A7",
            "level": 0,
            "drilldown": {
                "name": "MSIE versions",
                "level": 1,
                "color": "#4572A7",
                "categories": ["MSIE 8.0", "MSIE 6.0", "MSIE 7.0", "MSIE 9.0"],
                "data": [
                    {
                        "y": 33.06,
                        "color": "#4572A7",
                        "level": 1,
                        "drilldown": {
                            "name": "drilldown next level",
                            "level": 2,
                            "color": "#4572A7",
                            "categories": ["a", "b", "c"],
                            "data": [23,54,47]
                        }
                    },
                ]
            }
        }

注意,当我向对象添加新属性时,这实际上可以深入到任何深度,但它是像这样的特殊格式

x['drilldown] = {}
x.drilldown['data] =[]
....and so on....

所以假设在某个时刻我有以下对象结构:

x {
 drilldown {
         data [
            drilldown {
                 data [1,2,3]
               }
             ]
       }
 }
.....................

我需要转到对象"x"的倒数第二个"data"元素并推送新值。因此,根据我上面的例子,它将是这样的:

x.drilldown.data.push(10);

因此,我需要在对象"x"中找到倒数第二个数据属性,然后在其中推送值

x倒数第二个数据数组.push(10);

我该怎么做?

=================================================

【新增解决方案】

我添加了下面的代码,它运行良好。我希望这是正确的做法:

var data = [10,11,12];
var datatemp = x.drilldown;
var datatempvar = {};
for (;typeof datatemp != 'undefined';)
{
    datatempvar = datatemp;
    datatemp = datatemp.drilldown;
}
for(it=0;it<data.length; it++)
    datatempvar.data.push(data[it]);

谢谢大家,这个论坛帮了我很多。

如果一个数据数组包含多个值,尤其是一些具有向下钻取和一些纯值的对象,该怎么办?

在任何情况下,您都必须设置一个循环,该循环测试是否还有两个级别的向下钻取,并对每个级别执行此操作。当它断开时,当前级别就是要添加元素的级别。

根据这个问题,我不确定你想要的是"倒数第二"项,还是最后一项。

但这里有一个例子,它将倒数第二项和最后一项都隔离开来。然后它在最后一项上推送一个值。

<html>
<head>
<script type="text/javascript">
        x =    {
            "drilldown": {
                "data": 
                    {
                        "drilldown": {
                            "data": [23,54,47]
                        }
                    }
            }
        }


    function pushValue(dataItem, value) {
        var parent = null;
        var child = dataItem;
        while(child.drilldown != null) {
            parent = child;
             child = child.drilldown.data;
        }
        // Child is now the last item in the structure
        // and parent is the second last item 
        child.push(value);
    }
    function performTest() {
        pushValue(x, 36);
        }
</script>
</head>
<body>
    <button onclick="performTest()">Run</button>
</body>
</html>