使用javascript循环遍历对象和嵌套对象的递归函数

时间:2021-02-26 20:25:06

标签: javascript loops object recursion nested-loops

要更新我的问题,我希望能够访问对象和嵌套对象上的每个值,但我不知道如何执行此操作。我首先尝试了 foreach 循环和 for 循环,但我不知道如何获得“评论”,例如

data.forEach((element) => {
    const name = element.restaurantName;
    const address = element.address;
    for(let i = 0; i < data.length; i++) {
        const comment = element.ratings[i].comment;
    }
    init_resto(name, address, comment);
});

var list_group = document.getElementById('list-group'); 

function init_resto(name, address, comment) {
    var liElt = document.createElement('li');
    liElt.innerHTML = 
    "<li class=\"list-group-item\">" + name + "</li>" +  
    "<li class=\"list-group-item\">" + address + "</li>" +
    "<li class=\"list-group-item\">" + comment + "</li>";  
    list_group.appendChild(liElt);
}

我的预期输出:

"branco"
"39 Rue des Petites Écuries, 75010 Paris"
"Un excellent restaurant, j'y reviendrai ! Par contre il vaut mieux aimer la viande."
Tout simplement mon restaurant préféré !

"Babalou"
"address":"4 Rue Lamarck, 75018 Paris"
"Une minuscule pizzeria délicieuse cachéejuste à côté du Sacré choeur !"
...

这是我的数据:

[
    {
       "restaurantName":"Bronco",
       "address":"39 Rue des Petites Écuries, 75010 Paris",
       "lat":48.8737815,
       "long":2.3501649,
       "ratings":[
          {
             "stars":4,
             "comment":"Un excellent restaurant, j'y reviendrai !Par contre il vaut mieux aimer la viande."
          },
          {
             "stars":5,
             "comment":"Tout simplement mon restaurant préféré !"
          }
       ]
    },
    {
       "restaurantName":"Babalou",
       "address":"4 Rue Lamarck, 75018 Paris",
       "lat":48.8865035,
       "long":2.3442197,
       "ratings":[
          {
             "stars":5,
             "comment":"Une minuscule pizzeria délicieuse cachéejuste à côté du Sacré choeur !"
          },
          {
             "stars":3,
             "comment":"J'ai trouvé ça correct, sans plus"
          }
       ]
    }
 ]

然后我尝试使用递归函数,这可能是一种更好的方法,但我不知道如何在不覆盖这些值的情况下获取所有值:

function recurse(obj) {
    let value= "";
    for (let property in obj) { 
        value = obj[property];

        if(typeof obj[property] == "object" && obj[property] !== null) { 
            value = recurse(obj[property]);  
        }

    }
    return value;
}

1 个答案:

答案 0 :(得分:2)

评论解释了为什么您的代码只返回一个值。

很难确定您要做什么。如果您只想收集对象树的叶值,那么这个简单的递归应该可以做到:

const getValues = (obj) => 
  Object (obj) === obj
    ? Object .values (obj) .flatMap (getValues)
    : obj

const input = [{restaurantName: "Bronco", address: "39 Rue des Petites Écuries, 75010 Paris", lat: 48.8737815, long: 2.3501649, ratings: [{stars: 4, comment: "Un excellent restaurant, j'y reviendrai !Par contre il vaut mieux aimer la viande."}, {stars: 5, comment: "Tout simplement mon restaurant préféré !"}]}, {restaurantName: "Babalou", address: "4 Rue Lamarck, 75018 Paris", lat: 48.8865035, long: 2.3442197, ratings: [{stars: 5, comment: "Une minuscule pizzeria délicieuse cachéejuste à côté du Sacré choeur !"}, {stars: 3, comment: "J'ai trouvé ça correct, sans plus"}]}]

console .log (input .map (getValues))
.as-console-wrapper {max-height: 100% !important; top: 0}

(我发现 Object (obj) === obj 的类型检查比执行 typeof 更干净。)

但如果这不是您的预期输出,请编辑问题以包含预期输出。