从JavaScript数组递归构建JSON
我想从http请求返回的数组中构建一个JSON对象 我的实际阵列如下所示:从JavaScript数组递归构建JSON,javascript,arrays,typescript,recursion,Javascript,Arrays,Typescript,Recursion,我想从http请求返回的数组中构建一个JSON对象 我的实际阵列如下所示: [{ Description: "Product" IsInstanciable: false IsMasked: false Name: "ProductBase" Subclasses: [{ Description: "Product2" IsInstanciable: false
[{
Description: "Product"
IsInstanciable: false
IsMasked: false
Name: "ProductBase"
Subclasses: [{
Description: "Product2"
IsInstanciable: false
IsMasked: false
Name: "ProductBase2",
Count: 5,
Subclasses:[]
},
{
Description: "Product3"
IsInstanciable: false
IsMasked: false
Name: "ProductBase3",
Count: 4,
Subclasses:[],
}]
},
{
Description: "Product4"
IsInstanciable: false
IsMasked: false
Name: "ProductBase4",
Count: '...',
Subclasses: [...]
}
我想从上面的数组递归地创建一个JSON对象。它将如下所示:
[
{
name: 'Product',
Count: 9,
children: [
{name: 'Product2'},
{name: 'Product3'},
]
}, {
name: 'Product4',
children: [
{
name: '...',
Count: 'Sum of Count in all children by level'
children: [
{name: '...'},
{name: '...'},
]
}
]
},
];
function MapObject(object) {
if(!object || object.length < 0) return [];
return object.map(obj => { return {
name: obj.Description,
children: MapObject(obj.Subclasses)
}});
}
这是我在typescript中的递归函数,但它没有按预期工作。我怎样才能解决这个问题
递归(数据,堆栈:TreeNode[]){
让elt:TreeNode={name:'',子项:[]}
如果(data.subclass.length>0){
elt.name=data.Description;
data.subclass.forEach(元素=>{
elt.children.push({name:element.Description});
递归(元素、堆栈);
});
}否则{
elt.name=data.Description;
}
堆栈推送(elt);
}
您可以将map函数与递归函数一起使用,如下所示:
[
{
name: 'Product',
Count: 9,
children: [
{name: 'Product2'},
{name: 'Product3'},
]
}, {
name: 'Product4',
children: [
{
name: '...',
Count: 'Sum of Count in all children by level'
children: [
{name: '...'},
{name: '...'},
]
}
]
},
];
function MapObject(object) {
if(!object || object.length < 0) return [];
return object.map(obj => { return {
name: obj.Description,
children: MapObject(obj.Subclasses)
}});
}
函数映射对象(对象){
如果(!object | | object.length<0)返回[];
return object.map(obj=>{return{
名称:对象描述,
子类:MapObject(对象子类)
}});
}
下面是一个完整的工作示例:
var示例=[{
说明:“产品”,
IsInstanced:错误,
问:错,
名称:“ProductBase”,
子类:[{
说明:“产品2”,
IsInstanced:错误,
问:错,
名称:“ProductBase2”,
子类:[]
},
{
说明:“产品3”,
IsInstanced:错误,
问:错,
名称:“ProductBase3”,
子类:[]
}]
},
{
说明:“产品4”,
IsInstanced:错误,
问:错,
名称:“ProductBase4”
}]
函数映射对象(对象){
如果(!object | | object.length<0)返回[];
return object.map(obj=>{return{
名称:对象描述,
子类:MapObject(对象子类)
}});
}
log(MapObject(示例))代码>我会将其分解为几个单独的功能,并明确职责:
const sum=(ns)=>
ns.减少((a,b)=>a+数字(b),0)
const getCount=(产品)=>
(product.Count | | 0)+sum((product.subclass | |[]).map(getCount))
常量提取=(产品)=>
({
名称:产品名称,
计数:getCount(产品),
子类:product.subclass.map(摘录)
})
const extractAll=(产品)=>
产品.地图(摘录)
const products=[{“Description”:“Product”,“isinstanced”:false,“ismask”:false,“Name”:“ProductBase”,“subclass”:[{“Count”:5,“Description”:“Product2”,“isinstanced”:false,“ismask”:false,“Name”:“ProductBase2”,“subclass”:[]},{“Count”:4,“Description”:“Product3”,“isinstanced”:false,“ismask”:false,“Name”:“ProductBase3”,“子类”:[]}],{“计数”:3,“描述”:“Product4”,“IsInstanced”:false,“IsMask”:false,“名称”:“ProductBase4”,“子类”:[]}]
控制台日志(
抽提物(产品)
)
Hi Ricardo,如果我想按级别添加所有计数属性的总和,该怎么办?谢谢你能举一个json的例子吗?我修改了上面问题中的json例子