2016-11-29 16 views
1

私はこのjsonからこのツリー配列を構築する必要があります 私はまだfilter、map、reduceを使ってみましたが、結果は得られません。javascriptのjsonからツリー配列を作成します

[{ 
    "code": "2", 
    "name": "PENDING" 
},{ 
    "code": "2.2", 
    "name": "PENDING CHILDREN" 
}, { 
    "code": "2.2.01.01", 
    "name": "PENDING CHILDREN CHILDREN" 
}, { 
    "code": "2.2.01.02", 
    "name": "PENDING CHILDREN CHILDREN02" 
}, { 
    "code": "1", 
    "name": "ACTIVE" 
}, { 
    "code": "1.1", 
    "name": "ACTIVE CHILDREN" 
}, { 
    "code": "1.1.01", 
    "name": "ACTIVE CHILDREN CHILDREN" 
}] 

が、私は削減使ってみて、私はjavascrtipで、このロジックを構築理解しないあなたのコード名で

[{ 
    "code": "2", 
    "name": "PENDING", 
    "children": [{ 
    "code": "2.2", 
    "name": "PENDING CHILDREN", 
    "children": [{ 
     "code": "2.2.01.01", 
     "name": "PENDING CHILDREN CHILDREN" 
     }, { 
     "code": "2.2.01.02", 
     "name": "PENDING CHILDREN CHILDREN02" 
    }] 
    }] 
},{ 
    "code": "1", 
    "name": "ACTIVE", 
    "children": [{ 
    "code": "1.1", 
    "name": "ACTIVE CHILDREN", 
    "children": [{ 
     "code": "1.1.01", 
     "name": "ACTIVE CHILDREN CHILDREN" 
    }] 
    }] 
}] 

をこのツリー構造を構築する必要がある場合。

var idToNodeMap = contas.reduce(function(map, node, i) { 
    map[node.code] = node; 
    node.children = []; 


    return map; 
}); 
+0

あなたは '2.2'から' 2.2.01.01'に、あなたのデータの穴のいくつかの種類があります。 –

+0

'code'のルールは何ですか? –

+0

これはJSONと何が関係がありますか? –

答えて

1

以下の私のコードを実行します。これは、あなたの問題ソートされたデータで

function ensureNode(code, name, root) { 
 
    var last; 
 
    var node = code.split(/\./g).reduce((prev, cur) => { 
 
    last = (last && (last + '.' + cur)) || cur; 
 
    if(!prev.children){ 
 
     prev.children = []; 
 
    } 
 
    var result = prev.children.find(item => item.code === last); 
 
    if(!result) { 
 
     prev.children.push(result = {code: last}); 
 
    } 
 
    return result; 
 
    }, root); 
 
    node.name = name; 
 
} 
 

 

 
var data = [{ 
 
    "code": "2", 
 
    "name": "PENDING" 
 
},{ 
 
    "code": "2.2", 
 
    "name": "PENDING CHILDREN" 
 
}, { 
 
    "code": "2.2.01.01", 
 
    "name": "PENDING CHILDREN CHILDREN" 
 
}, { 
 
    "code": "2.2.01.02", 
 
    "name": "PENDING CHILDREN CHILDREN02" 
 
}, { 
 
    "code": "1", 
 
    "name": "ACTIVE" 
 
}, { 
 
    "code": "1.1", 
 
    "name": "ACTIVE CHILDREN" 
 
}, { 
 
    "code": "1.1.01", 
 
    "name": "ACTIVE CHILDREN CHILDREN" 
 
}]; 
 

 
var result = {}; 
 

 
          
 
data.forEach(item => ensureNode(item.code, item.name, result)); 
 
    
 
console.log(result);

0

を解決することが、あなたがの参考のために木や配列を構築するためのオブジェクトを使用することができます親。

var data = [{ "code": "2", "name": "PENDING" }, { "code": "2.2", "name": "PENDING CHILDREN" }, { "code": "2.2.01.01", "name": "PENDING CHILDREN CHILDREN" }, { "code": "2.2.01.02", "name": "PENDING CHILDREN CHILDREN02" }, { "code": "1", "name": "ACTIVE" }, { "code": "1.1", "name": "ACTIVE CHILDREN" }, { "code": "1.1.01", "name": "ACTIVE CHILDREN CHILDREN" }], 
 
    tree = function (data, root) { 
 
     var o = {}, last = [root], level = 0; 
 
     o[root] = {}; 
 
     data.forEach(function (a) { 
 
      var parent = root; 
 
      while (level && last[level].length >= a.code.length) { 
 
       level--; 
 
      } 
 
      parent = last[level]; 
 
      level++; 
 
      last.length = level; 
 
      last.push(a.code); 
 
      o[a.code] = a; 
 
      o[parent].children = o[parent].children || []; 
 
      o[parent].children.push(a); 
 
     }); 
 
     return o[root].children; 
 
    }(data, ''); 
 

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

関連する問題