Javascript 在递归函数中构建嵌套对象数组
根据我最初专门针对React()提出的问题,我意识到这个问题相当普遍 我有一个递归函数,它基本上循环遍历一个树状JSON结构,每次它输出一个分支时,我希望传递树中结构位置的对象,如下所示。。有没有更简单的方法通过结构?数据结构是否糟糕/每个chid是否应附加唯一的ID 下面是我的JSON对象,您可以看到我正在使用的内容 非常感谢任何帮助 级别1子级 {值:“水果”} 第2级儿童 {value:“水果”,嵌套的_值:[{value:'热带'}]} 第3级儿童 {value:“水果”,嵌套的_值:[{value:'热带',嵌套的_值:[{value:'菠萝'}]} 代码-有点有效,但我会在相同的嵌套_值数组中获取所有值Javascript 在递归函数中构建嵌套对象数组,javascript,json,recursion,ecmascript-6,Javascript,Json,Recursion,Ecmascript 6,根据我最初专门针对React()提出的问题,我意识到这个问题相当普遍 我有一个递归函数,它基本上循环遍历一个树状JSON结构,每次它输出一个分支时,我希望传递树中结构位置的对象,如下所示。。有没有更简单的方法通过结构?数据结构是否糟糕/每个chid是否应附加唯一的ID 下面是我的JSON对象,您可以看到我正在使用的内容 非常感谢任何帮助 级别1子级 {值:“水果”} 第2级儿童 {value:“水果”,嵌套的_值:[{value:'热带'}]} 第3级儿童 {value:“水果”,嵌套的_值:[
const createSelectionHierarchy = (data, isSub, level = 2, hierarchy = {}) => {
let children = [];
if (isSub) { level++; }
let obj = {};
obj.name = cat;
const cat = hierarchy.value;
for (let i in data) {
const subcat = data[i].value;
if (typeof(data[i].nested_values) === 'object') { // Sub array found, build structure
obj.values = subcat;
obj.nested_values = [];
hierarchy.nested_values.push(obj);
children.push(
<FilterItem key={i} data={data[i]} hierarchy={hierarchy} level={level}>
{createSelectionHierarchy(data[i].nested_values, true, level, hierarchy)}
</FilterItem>
);
} else { // No sub array, bottom of current branch
children.push(
<p className="filter-item level-last" key={i}>
{data[i].value}
</p>);
}
}
return children;
}
所需输出
<FilterItem ...... hierarchy={{value: "Fruit"}}>
<FilterItem ...... hierarchy={{value: "Fruit", nested_values: [{ value: 'Tropical'}] }}>
<FilterItem ...... hierarchy={{value: "Fruit", nested_values: [{ value: 'Tropical', nested_values:[{ value: 'Pineapple' }]}] }}>
</FilterItem>
</FilterItem>
</FilterItem>
对于每个分支(树的级别),此函数将提取值,然后对其每个子级(如果有)调用自身,并将其返回值存储在数组中
function convert(branch) {
const hierarchy = {
value: branch.value
};
if (branch.nested_values !== undefined)
hierarchy.nested_values = branch.nested_values.map(subranch => convert(subranch))
return hierarchy;
}
const输入={
“价值”:“水果”,
“发生次数”:5,
“嵌套的_值”:[{
“价值”:“浆果”,
“发生次数”:3,
“嵌套的_值”:[{
“价值”:“草莓”,
“发生次数”:1
}, {
“价值”:“黑莓”,
“发生次数”:1
}, {
“价值”:“覆盆子”,
“发生次数”:1
}, {
“价值”:“红醋栗”,
“发生次数”:1
}, {
“价值”:“黑醋栗”,
“发生次数”:1
}, {
“价值”:“醋栗”,
“发生次数”:1
}, {
“价值”:“蔓越莓”,
“发生次数”:1
}, {
“值”:“白加仑子”,
“发生次数”:1
}, {
“价值”:“Loganberry”,
“发生次数”:1
}, {
“价值”:“草莓”,
“发生次数”:1
}]
}, {
“价值”:“热带”,
“发生次数”:2,
“嵌套的_值”:[{
“价值”:“菠萝”,
“发生次数”:1
}, {
“价值”:“芒果”,
“发生次数”:1
}, {
“价值”:“番石榴”,
“发生次数”:1
}, {
“价值”:“百香果”,
“发生次数”:1
}, {
“价值”:“龙果”,
“发生次数”:1
}]
}]
};
函数转换(分支){
常量层次结构={
值:branch.value
};
if(branch.nested_值!==未定义)
hierarchy.nested_values=branch.nested_values.map(subranch=>convert(subranch))
返回层次;
}
console.log(转换(输入))
@r1verside-你有例子吗?@ibrahimmahrir-我更新了我的答案你有JavaScript(意思是ECMA脚本)版本的代码吗?@Traktor53-很遗憾没有,但上面的内容很容易理解?这只是一个函数,唯一的wierd位是我将JSX元素推入数组而不是数组object@Zinc请看一下我的答案,看看这是否是你想要的。如果是的话,我会添加一个解释。谢谢你这么说,但我认为你把我的问题看得太过直白了,我只是在寻找层次结构对象,以便在每次迭代时将一个新的数组结构推入其中。i、 e.hierarchy={{value:“Fruit”},然后hierarchy={{value:“Fruit”,嵌套的_值:[{value:'Tropical'}]}}我猜是的。您所追求的更简单-请参阅edit.Cool,我如何将其应用到上面的递归函数中?
function convert(branch) {
const hierarchy = {
value: branch.value
};
if (branch.nested_values !== undefined)
hierarchy.nested_values = branch.nested_values.map(subranch => convert(subranch))
return hierarchy;
}