我有一个这样的对象:
"1": "test1"
"1.1": "test2"
"1.1.1": "test3"
"1.2": "test4"
"2": "test5"
我想创建一个这样的数组:
"data": [
{"data": "test1",
"children": [
{"data": "test2",
"children": [{"data": "test3"}]},
{"data": "test4"}]},
{"data": "test5"}
]
我开始循环列表并用点分割键 我想也许我可以先建立一个returnArray [splitedkey [0]] [splitedkey [1]],但我不知道我的列表有多少级别。
有谁知道如何解决这个问题?
答案 0 :(得分:1)
您遇到的非显而易见的问题:
1.1.1
之前,算法有可能会遇到1
,因此实施需要使空白父母{ data: null, children [] }
这是一个解决方案。 setVal
会递归爬网到accessPath
指定的正确深度,[1, 1, 1]
是一组访问者(例如nestObj
)。 obj
读取var obj = {
"1": "test1",
"1.1": "test2",
"1.1.1": "test3",
"1.2": "test4",
"2": "test5"
}
function setVal (array, accessPath, val) {
if (accessPath.length === 1) {
if (array[accessPath] === undefined)
array[accessPath] = { data: val, children: [] };
else
array[accessPath].data = val;
} else {
// Deals with out-of-order iteration
if (array[accessPath[0]] === undefined)
array[accessPath[0]] = { data: null, children: [] };
setVal(array[accessPath[0]].children, accessPath.slice(1), val);
}
}
function nestObj (obj) {
var ret = [];
Object.keys(obj).forEach(function (key) {
var val = obj[key];
var accessPath = key.split(".").map(function (entry) { return parseInt(entry, 10); });
setVal(ret, accessPath, val);
});
return ret;
}
// The format you specified
var answer = { data: nestObj(obj) };
,提取密钥,将其映射到指标,然后将它们附加到您的返回值中。
parseInt
您不一定需要在访问密钥上使用ALTER Table account_invoice ALTER amount_total SET DATA TYPE NUMERIC(5,Y);
。这个算法(通常)可以使用任意字符串键通过关联数组。
答案 1 :(得分:0)
试试这个:
var a = {"1": "test1", "1.1": "test2", "1.1.1": "test3", "1.2": "test4", "2": "test5"};
var b = {data: []};
Object.keys(a).forEach(function (item, index, arr) {
if (item.indexOf(".") !== -1) {
console.log(item, a[item]);
var sp = item.split(".");
var parent = b.data[sp[0] - 1];
for (var i = 1; i < sp.length - 1; i++) {
parent = parent.children[sp[i] - 1];
}
parent.children.push({data: a[item], children: []});
} else {
b.data.push({data: a[item], children: []});
}
});
console.log(b);