由于对数组进行了排序,因此可以使用递归函数来实现它:
const delimiter = '-';
const delimiterCount = x => x.id.split('').reduce((acc, c) => acc + (c === delimiter), 0);
function descend(tree, node, count) {
if (count == 0) {
tree.push(node);
return;
}
return descend(tree[tree.length - 1].children, node, count - 1);
}
function buildTree(list){
let tree = []
for (var i = 0; i < list.length; i++) {
let count = delimiterCount(list[i]);
descend(tree, list[i], count);
}
return tree;
}
以及一些“原始”单元测试:
{
let actual = buildTree([{"id":"1","children":[]},{"id":"1-1","children":[]},{"id":"1-1-1","children":[]},{"id":"1-1-1-1","children":[]},{"id":"1-1-1-1-1"}])
let expected = [{"id":"1","children":[{"id":"1-1","children":[{"id":"1-1-1","children":[{"id":"1-1-1-1","children":[{"id":"1-1-1-1-1"}]}]}]}]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) {console.log("expected:\n" + JSON.stringify(expected, null, 2));console.log("actual:\n" + JSON.stringify(actual, null, 2))}
else console.log(true);
}
{
let actual = buildTree([{"id":"1","children":[]},{"id":"1-1","children":[]},{"id":"1-1-1","children":[]},{"id":"1-1-1-1"}])
let expected = [{"id":"1","children":[{"id":"1-1","children":[{"id":"1-1-1","children":[{"id":"1-1-1-1"}]}]}]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) {console.log("expected:\n" + JSON.stringify(expected, null, 2));console.log("actual:\n" + JSON.stringify(actual, null, 2))}
else console.log(true);
}
{
let actual = buildTree([{"id":"1","children":[]},{"id":"1-1","children":[]},{"id":"1-1-1"},{"id":"1-2","children":[]},{"id":"1-2-1"},{"id":"2","children":[]},{"id":"2-1"}])
let expected = [{"id":"1","children":[{"id":"1-1","children":[{"id":"1-1-1"}]},{"id":"1-2","children":[{"id":"1-2-1"}]}]},{"id":"2","children":[{"id":"2-1"}]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) {console.log("expected:\n" + JSON.stringify(expected, null, 2));console.log("actual:\n" + JSON.stringify(actual, null, 2))}
else console.log(true);
}
{
let actual = buildTree([{"id":"1","children":[]},{"id":"1-1","children":[]},{"id":"1-1-1"},{"id":"1-2"},{"id":"2","children":[]},{"id":"2-1"}])
let expected = [{"id":"1","children":[{"id":"1-1","children":[{"id":"1-1-1"}]},{"id":"1-2"}]},{"id":"2","children":[{"id":"2-1"}]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) {console.log("expected:\n" + JSON.stringify(expected, null, 2));console.log("actual:\n" + JSON.stringify(actual, null, 2))}
else console.log(true);
}
{
let actual = buildTree([{"id":"1","children":[]},{"id":"1-1","children":[]},{"id":"1-1-1"},{"id":"2","children":[]},{"id":"2-1"}])
let expected = [{"id":"1","children":[{"id":"1-1","children":[{"id":"1-1-1"}]}]},{"id":"2","children":[{"id":"2-1"}]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) {console.log("expected:\n" + JSON.stringify(expected, null, 2));console.log("actual:\n" + JSON.stringify(actual, null, 2))}
else console.log(true);
}
{
let actual = buildTree([{"id":"1","children":[]},{"id":"1-1","children":[]},{"id":"1-1-1"},{"id":"2","children":[]}])
let expected = [{"id":"1","children":[{"id":"1-1","children":[{"id":"1-1-1"}]}]},{"id":"2","children":[]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) {console.log("expected:\n" + JSON.stringify(expected, null, 2));console.log("actual:\n" + JSON.stringify(actual, null, 2))}
else console.log(true);
}
{
let actual = buildTree([{"id":"1","children":[]},{"id":"1-1","children":[]},{"id":"1-1-1"},{"id":"1-1-2"}])
let expected = [{"id":"1","children":[{"id":"1-1","children":[{"id":"1-1-1"},{"id":"1-1-2"}]}]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) {console.log("expected:\n" + JSON.stringify(expected, null, 2));console.log("actual:\n" + JSON.stringify(actual, null, 2))}
else console.log(true);
}
{
let actual = buildTree([{"id":"1","children":[]},{"id":"1-1","children":[]},{"id":"1-1-1"}])
let expected = [{"id":"1","children":[{"id":"1-1","children":[{"id":"1-1-1"}]}]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) {console.log("expected:\n" + JSON.stringify(expected, null, 2));console.log("actual:\n" + JSON.stringify(actual, null, 2))}
else console.log(true);
}
{
let actual = buildTree([{"id":"1","children":[]},{"id":"1-1"},{"id":"2","children":[]},{"id":"2-1"}])
let expected = [{"id":"1","children":[{"id":"1-1"}]},{"id":"2","children":[{"id":"2-1"}]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) {console.log("expected:\n" + JSON.stringify(expected, null, 2));console.log("actual:\n" + JSON.stringify(actual, null, 2))}
else console.log(true);
}
{
let actual = buildTree([{"id":"1","children":[]},{"id":"1-1"},{"id":"1-2"}])
let expected = [{"id":"1","children":[{"id":"1-1"},{"id":"1-2"}]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) console.log(JSON.stringify(actual, null, 2))
else console.log(true);
}
{
let actual = buildTree([{"id":"1","children":[]},{"id":"1-1"}])
let expected = [{"id":"1","children":[{"id":"1-1"}]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) console.log(JSON.stringify(actual, null, 2))
else console.log(true);
}
{
let actual = buildTree([{id: "1","children":[]}, {id: "2","children":[]}])
let expected = [{"id":"1","children":[]},{"id":"2","children":[]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) console.log(JSON.stringify(actual, null, 2))
else console.log(true);
}
{
let actual = buildTree([{id: "1", "children": []}])
let expected = [{"id":"1","children":[]}];
let b = JSON.stringify(actual) === JSON.stringify(expected);
if (!b) console.log(JSON.stringify(actual, null, 2))
else console.log(true);
}
Try it online!