【问题标题】:Recursive iterating over structures递归迭代结构
【发布时间】:2016-07-07 20:30:01
【问题描述】:

我有以下结构:

var struct = [{
    "name": "Name1",
    "type": "type1",
    "children": [{
        "name": "Name11",
        "type": "type1",
        "children": [{
            "name": "Name111",
            "type": "type1"
            },
            {
            "name": "Name112",
            "type": "type2"
            }
        }]
    }]
}];

我想遍历 type 等于 type1 的所有 name-type 元素,并为每个元素创建一个 <option> 元素。

所以应该是这样的:

var iterate = function (data) {
   var elements = [];
   for (var i in data) {
      if (data[i].type == 'type1') {
         var option = document.createElement('option');
         option.innerHTML = data[i].name;
         elements.push(option);
         elements.push(iterate(data[i].children));
      }
   }
   return elements;
};

但是它给了我错误的结果。而且可能效率很低。我应该如何正确地做到这一点?

【问题讨论】:

    标签: javascript recursion


    【解决方案1】:

    您可以使用迭代递归方法来获取嵌套数据。

    function getElements(data) {
        var elements = [];
        data.forEach(function iter(a) {
            var option;
            if (a.type === 'type1') {
                option = document.createElement('option');
                option.innerHTML = a.name;
                elements.push(option);
                Array.isArray(a.children) && a.children.forEach(iter); // assuming only 
            }                                                          // type1 branches
        });                                                            // to iterate
        return elements;
    }
    
    var struct = [{ "name": "Name1", "type": "type1", "children": [{ "name": "Name11", "type": "type1", "children": [{ "name": "Name111", "type": "type1" }, { "name": "Name112", "type": "type2" }] }] }];
    
    console.log(getElements(struct));

    【讨论】:

    • 酷,它有效。问题是它会比递归方法更快吗?
    • 它是递归的,在这一行:Array.isArray(a.children) && a.children.forEach(iter);
    【解决方案2】:

    我认为你不能使用任何“元素”变量,试试这个:

    var iterate = function (data) {
       for (var i in data) {
          if (data[i].type == 'type1') {
             var option = document.createElement('option');
             option.innerHTML = data[i].name;
             data[i].push(option);
             iterate(data[i].children);
          }
       }
       return data;
    };
    

    【讨论】:

      猜你喜欢
      • 2019-12-25
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 2019-12-10
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      • 2010-10-10
      相关资源
      最近更新 更多