递归迭代结构

时间:2016-07-07 11:59:11

标签: javascript recursion

我有以下结构:

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

我想迭代所有类型等于type1的名称类型元素,并为每个元素创建一个<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;
};
然而,它给了我错误的结果。而且效率可能非常低。我该怎么做呢?

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:0)

我认为你不能使用任何“元素”var,只需试试这个:

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;
};