Javascript 如何解析JSON树并检查名称在整个树结构中是否唯一?
我有这棵树,它可以比这更深入,我需要确保每个单位、实体和投资组合的名称在整个树中都是唯一的。有人能帮我用JS(ES6)实现解析这个树并检查名称的唯一性吗?多谢各位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: [
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))代码>可能想尝试递归为什么不投票。它起作用了。它也适用于大型对象