打印对象数组的完整路径

3

大家好

我有一个对象数组,需要打印出每个节点值的路径,并打印出特定节点(按名称)的最后一个键和值。

这是对象数组或JSON格式:

[{
    "Name": "2007",
    "Elements": [{
            "Name": "country1",
            "Elements": [{
                "House": "house1",
                "water": 1.8
            }],
            "Data": {}
        },
        {
            "Name": "country2",
            "Elements": [{
                "Name": "city2",
                "Elements": [{
                    "Name": "neighbourhood2",
                    "Elements": [{
                        "House": "house2",
                        "water": 2.8
                    }]
                }],
                "Data": {}

            }],
            "Data": {}
        },
        {
            "Name": "country3",
            "Elements": [{
                "House": "house2",
                "uni bill": 3.8
            }],
            "Data": {}
        }
    ],
    "Data": {}
}]

输出应该像这样。
2007 > country1 > house > water: 1.8
2007 > city2 > neighbourhood2 > house2 > electricity: 2.8
2007 > country3 > house > uni bill: 3.8

++++++++++++++ edited +++++++++++++++

function objectToPaths(data) {
    var validId = /^[a-z_$][a-z0-9_$]*$/i;
    var result = [];
   doIt(data, "");
    return result;

    function doIt(data, s) {
      if (data && typeof data === "object") {
       if (Array.isArray(data)) {
          for (var i = 0; i < data.length; i++) {
            doIt(data[i], s + "");
          }
        } else {
          for (var p in data) {
            if (validId.test(p)) {

              doIt(data[p], s + " > " + data[p]);
             } else {
              doIt(data[p], s + "");
           }
          }
        }
      } else {
        result.push(s);
      }
   }
 }

这是一个我在这里找到的函数的重写,但结果并不如预期。
+++++++++++++++++++++++ 编辑结束 +++++++++++++++++++++++
请帮忙。
提前感谢。

2
{btsdaf} - shawon191
1
这似乎是你试图让别人替你完成工作,这通常不是社区的宗旨。分享你之前的尝试可能会帮助我们进行调试。 - tomcek112
{btsdaf} - rebh. a.m
2个回答

4
您需要的是一个深度优先遍历函数,它可以递归地打印属性。请参考Depth First Traversal

function print(arr, path) {                              // print takes an array an an accumulated path from which it will start printing
  arr.forEach(function(obj) {                            // for each object obj in the array
    if(obj.Elements) {                                   // if the object obj has sub elements in it
      print(obj.Elements, path + " > " + obj.Name);      // then call print on those elements, providin the absolute path to this object
    } else {                                             // otherwise (it is a leaf)
      const bills = Object.keys(obj)
        .filter(key => key !== "House")
        .map(key => `${key}: ${obj[key]}`)
        .join(', ')
      console.log(path.slice(3) + " > " + obj.House + " > " + bills);    // print the accumulated path along with the House property of this object (removing the first 3 letters from path which are equal to " > ")
    }
  });
};

var arr = [{"Name":"2007","Elements":[{"Name":"country1","Elements":[{"House":"house1","water":1.8}],"Data":{}},{"Name":"country2","Elements":[{"Name":"city2","Elements":[{"Name":"neighbourhood2","Elements":[{"House":"house2","water":2.8}]}],"Data":{}}],"Data":{}},{"Name":"country3","Elements":[{"House":"house2","uni bill":3.8}],"Data":{}}],"Data":{}}];

print(arr, "");


{btsdaf} - Nina Scholz
请问一下,对于.map(key => ${key}: ${obj[key]})这个表达式的结果是什么?这是ES6吗? - RJ-
@RJ 那部分代码不是我添加的(请查看修订记录)。它只是将账单添加到路径的末尾。 - ibrahim mahrir

2
您可以编写一个迭代函数,并收集到最后一个对象的路径。

function iter(array, path) {
    path = path || [];
    array.forEach(function (o) {
        if (o.Elements) {
            return iter(o.Elements, path.concat(o.Name));
        }
        Object.keys(o).forEach(function (k) {
            if (k !== 'House') {
                console.log(path.concat(o.House, k).join(' > ') + ': ' + o[k]);
            }
        });            
    });
}

var data = [{ Name: "2007", Elements: [{ Name: "country1", Elements: [{ House: "house1", water: 1.8 }], Data: {} }, { Name: "country2", Elements: [{ Name: "city2", Elements: [{ Name: "neighbourhood2", Elements: [{ House: "house2", water: 2.8 }] }], Data: {} }], Data: {} }, { Name: "country3", Elements: [{ House: "house2", "uni bill": 3.8 }], Data: {} }], Data: {} }];

iter(data);
.as-console-wrapper { max-height: 100% !important; top: 0; }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接