我有一个对象A
,如下所示。
var A = {
"1": [ "1_1", "1_2", "1_3" ],
"2": [ "2_1", "2_2" ]
};
需要使用js动态构建新数组。假设
对象键应该映射到数组AA的属性文本,值应该是子项,如下所示。
var AA = [
{
"text": "1",
"state": "open",
"children": [
{ "text": "1_1" },
{ "text": "1_2" },
{ "text": "1_3" }
]
},
{
"text": "2",
"state": "open",
"children": [
{ "text": "2_1" },
{ "text": "2_2" }
]
}
];
这是我的功能,但它没有按预期工作。有人可以帮忙吗?
function constructJSONArr() {
var A = {
"1": [ "1_1", "1_2", "1_3" ],
"2": [ "2_1", "2_2" ]
};
for (var key in A) {
var tempArr = [];
tempArr.push(key);
for (var i = 0; i < key.length; i++) {
return {
'text': key,
'state': 'closed',
'children': A[key].map(function(child) {
return {
'text': child
};
})
}
}
}
}
答案 0 :(得分:0)
当您返回函数内部时,函数结束并立即返回。在您的情况下,for循环内的return
会导致函数返回第一个关键对象。要解决此问题,您需要创建对象并将它们推入arr。您可以在Array.map()
内自由返回,因为每次迭代都会调用一个函数。
固定解决方案:
使用for...in
进行迭代。获取key
。将新对象推送到arr
。使用key
作为text
属性,state
和children
。要创建子项,请通过key
从原始对象获取数组,并使用Array.map()
生成子对象。返回arr
。
var A = {
"1": ["1_1", "1_2", "1_3"],
"2": ["2_1", "2_2"]
};
function constructJSONArr(A) {
var arr = [];
for (var key in A) {
arr.push({
text: key,
state: 'closed',
children: A[key].map(function(t) {
return {
text: t
};
})
});
}
return arr;
}
var result = constructJSONArr(A);
console.log(result);
ESNext解决方案
使用Object.entries()
从对象A
获取密钥和相应值。使用两个嵌套Array.map()
调用迭代条目。第一个创建外部对象,第二个创建子项。
const A = {
"1": ["1_1", "1_2", "1_3"],
"2": ["2_1", "2_2"]
};
const constructJSONArr = (obj) =>
Object.entries(obj).map(([text, children]) => ({
text,
state: 'closed',
children: children.map((text) => ({
text
}))
}));
var result = constructJSONArr(A);
console.log(result);
答案 1 :(得分:0)
您可以使用Object.keys()
遍历对象和Array.map
来创建新数组。
var A = {
"1": ["1_1", "1_2", "1_3"],
"2": ["2_1", "2_2"]
};
var transformed = Object.keys(A).map(key => {
return {
text: key,
state: "open",
children: A[key].map(value => {
return {
text: value
};
})
};
});
console.log(transformed);