Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在递归函数中构建嵌套对象数组_Javascript_Json_Recursion_Ecmascript 6 - Fatal编程技术网

Javascript 在递归函数中构建嵌套对象数组

Javascript 在递归函数中构建嵌套对象数组,javascript,json,recursion,ecmascript-6,Javascript,Json,Recursion,Ecmascript 6,根据我最初专门针对React()提出的问题,我意识到这个问题相当普遍 我有一个递归函数,它基本上循环遍历一个树状JSON结构,每次它输出一个分支时,我希望传递树中结构位置的对象,如下所示。。有没有更简单的方法通过结构?数据结构是否糟糕/每个chid是否应附加唯一的ID 下面是我的JSON对象,您可以看到我正在使用的内容 非常感谢任何帮助 级别1子级 {值:“水果”} 第2级儿童 {value:“水果”,嵌套的_值:[{value:'热带'}]} 第3级儿童 {value:“水果”,嵌套的_值:[

根据我最初专门针对React()提出的问题,我意识到这个问题相当普遍

我有一个递归函数,它基本上循环遍历一个树状JSON结构,每次它输出一个分支时,我希望传递树中结构位置的对象,如下所示。。有没有更简单的方法通过结构?数据结构是否糟糕/每个chid是否应附加唯一的ID

下面是我的JSON对象,您可以看到我正在使用的内容

非常感谢任何帮助

级别1子级

{值:“水果”}

第2级儿童

{value:“水果”,嵌套的_值:[{value:'热带'}]}

第3级儿童

{value:“水果”,嵌套的_值:[{value:'热带',嵌套的_值:[{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;
}