我试图将数组格式化为对象。它工作正常,但我需要知道,这是正确还是错误?还有其他任何标准方法吗?。
我使用了underscoreJS。
//我从API获得的内容
“A / a / 1”= A - >类别,a - >子类别,1 - >子类别的孩子。
["A", "A/a", "A/b", "A/a/1", "A/a/2", "B", "B/a"];
//我需要哪种格式。
[
{
"name":"A",
"parent":"",
"children":[
{
"name":"a",
"parent":"A",
"children":[
{
"name":"1",
"parent":"a",
"children":[
]
},
{
"name":"2",
"parent":"a",
"children":[
]
}
]
},
{
"name":"b",
"parent":"A",
"children":[
]
}
]
},
{
"name":"B",
"parent":"",
"children":[
{
"name":"a",
"parent":"B",
"children":[
]
}
]
}
]
我的代码:
var dataObj = function(){
this.name = "";
this.parent = "";
this.administrator = "";
this.children = [];
};
var d_ = [];
_.each(data, function(item, index){
var row = new dataObj();
var item_array = item.split("/"),
item_array_length = item_array.length;
if(item_array.length == 1){
row.name = item_array[0];
d_.push(row);
} else {
row.name = item_array[1];
row.parent = item_array[0];
var newC = d_[_.findIndex(d_, {name:item_array[0]})];
if(item_array.length == 2) {
newC.children.push(row);
} else if(item_array.length == 3) {
newC.children[_.findIndex(newC.children, {name: item_array[1]})]
.children.push({name : item_array[2], parent : item_array[1]});
}
}
});
更新 子类别的级别不受限制。 “A / A / 1 / I / N / X / Y ...。”
答案 0 :(得分:2)
我觉得你的实施可以改进。以下是几种可能性:
["A/b", "A/a/1", "A/a/2", "B/a"]
而不是["A", "A/a", "A/b", "A/a/1", "A/a/2", "B", "B/a"]
_
库似乎没有多大帮助,代码可以用普通的javaScript实现。我能想到的一个简单算法包括以下高级步骤:
sampleArray
。sampleArray
的每个元素,我们都有currentSplittedElementArray = sampleArray[i].split('/');
finalOutput
finalOutput
并测试该元素是否已存在finalOutput[i].name === currentSplittedElementArray[0]
currentSplittedElementArray
并使用finalOutput
元素更新currentSplittedElementArray
的相同元素。 (如果finalOutput
上尚未显示该元素,则首先在finalOutput
上创建元素并使用currentSplittedElementArray
我知道上面的算法可能看起来令人生畏,所概述的步骤将包括在循环中重复调用函数或使用某种递归。但如果我要实现这样的话,我会做的就是这样。
我对我的方法中的任何改进/优化领域持开放态度。