Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.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 如何解析JSON树并检查名称在整个树结构中是否唯一?_Javascript_Json_Reactjs_Ecmascript 6_Tree - Fatal编程技术网

Javascript 如何解析JSON树并检查名称在整个树结构中是否唯一?

Javascript 如何解析JSON树并检查名称在整个树结构中是否唯一?,javascript,json,reactjs,ecmascript-6,tree,Javascript,Json,Reactjs,Ecmascript 6,Tree,我有这棵树,它可以比这更深入,我需要确保每个单位、实体和投资组合的名称在整个树中都是唯一的。有人能帮我用JS(ES6)实现解析这个树并检查名称的唯一性吗?多谢各位 reduxTree: { units: [ { name: 'ROOT', units: [ { name: 'ORG1', units: [], entities: [

我有这棵树,它可以比这更深入,我需要确保每个单位、实体和投资组合的名称在整个树中都是唯一的。有人能帮我用JS(ES6)实现解析这个树并检查名称的唯一性吗?多谢各位

reduxTree: {
    units: [
      {
        name: 'ROOT',
        units: [
          {
            name: 'ORG1',
            units: [],
            entities: [
              {
                name: 'LE1',
                portfolios: [
                  {
                    name: 'PO1', 
                  }
                ]
              }
            ],
          },
          {
            name: 'ORG2',
            units: [],
            entities: [
              {
                name: 'LE2',
                portfolios: [
                  {
                    name: 'PO2',
                  }
                ]
              }
            ],
          }
        ],
        entities: [
          {
            name: 'LE3',
            portfolios: [
              {
                name: 'PO3',
              }
            ]
          }
        ],
      }
    ]
  }
试试这个

我提取所有
“name”:“
,并使用一个集合来查看它们是否唯一

const reduxTree={units:[{name:'ROOT',units:[{name:'ORG1',units:[{name:'LE1',公文包:[{name:'PO1',}]}],},{name:'ORG2',units:[{name:'LE2',公文包:[{name:'PO2',}]}],}],实体:[{name:'LE3',公文包:[{name:'PO3',}],}],}]}}]
const names=[…JSON.stringify(reduxTree).matchAll(/“name”:“(\w+)”/g)].map(m=>m[1])
const unique=新集合(名称)。大小===names.length

console.log(“Unique?”,Unique,names.join(“,”)
这是一种递归方法,我检查所有名称,如果其中一个名称出现两次,我就中断迭代

const reduxTree={units:[{name:'ROOT',units:[{name:'ORG1',units:[{name:'LE1',公文包:[{name:'PO1',}]}],},{name:'ORG2',units:[{name:'LE2',公文包:[{name:'PO2',}]}],}],实体:[{name:'LE3',公文包:[{name:'PO3',}],}],}],}];
const mySet=new Set();
函数validateTree(obj){
如果(!obj | | obj.length==0){
返回true;
}
if(mySet.has(obj[0].name)){
返回false;
}否则{
返回validateTree(obj[0]。单位)和&validateTree(obj[0]。实体)和&validateTree(obj[0]。投资组合)
}
}

console.log(validateTree(reduxTree.units))
您可以对一个收集可见名称的对象进行闭包,并对对象进行分解,以分离
名称
和对象的其余部分

检查名称后,如果在集合中,则返回false,否则将名称添加到集合中,并迭代并检查rest属性

const
hasUniqueNames=(对象,名称=新集合)=>{
常量c=({name,…rest})=>{
if(name!==未定义)if(names.has(name))返回false;
名称。添加(名称);
返回Object.values(rest).every(v=>!v | | typeof v!='Object'| | c(v));
};
返回c(对象);
},
reduxTree={units:[{name:'ROOT',units:[{name:'ORG1',units:[],实体:[{name:'LE1',公文包:[{name:'PO1'}]}]},{name:'ORG2',units:[{name:'LE2',公文包:[{name:'PO2'}]}]}],实体:[{name:'LE3',公文包:[{name:'PO3'}]}]}]},
结果=hasUniqueNames(reduxTree);

log(hasUniqueNames(reduxTree))可能想尝试递归为什么不投票。它起作用了。它也适用于大型对象