为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

潇潇雨雨 2023-11-02 21:22:12
我有这棵树,它可以比这棵树更深,我需要确保每个单位、实体和投资组合的名称在整个树中都是唯一的。谁能帮我用 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',              }            ]          }        ],      }    ]  }
查看完整描述

3 回答

?
RISEBY

TA贡献1856条经验 获得超5个赞

这是一种递归方法,我检查所有名称,如果一个名称出现两次,我就中断迭代


const 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', }] }], }] }; 

  

const mySet = new Set();

function validateTree(obj){

   if(!obj || obj.length == 0){

   return true;

   }

   if(mySet.has(obj[0].name)){

      return false;   

   } else {

     return validateTree(obj[0].units) && validateTree(obj[0].entities) && validateTree(obj[0].portfolios)

   }

}


console.log(validateTree(reduxTree.units))


查看完整回答
反对 回复 2023-11-02
?
翻翻过去那场雪

TA贡献2065条经验 获得超13个赞

您可以对收集可见名称的 a 进行闭包,并对要分离的对象和对象的其余部分Set进行解构。name


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


const

    hasUniqueNames = (object, names = new Set) => {

        const c = ({name, ...rest }) => {

            if (name !== undefined) if (names.has(name)) return false;

            names.add(name);

            return Object.values(rest).every(v => !v || typeof v !== 'object' || c(v));

        };


        return c(object);

    },

    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' }] }] }] },

    result = hasUniqueNames(reduxTree);


console.log(hasUniqueNames(reduxTree));


查看完整回答
反对 回复 2023-11-02
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

尝试一下这个


我提取所有"name":"<name>"并使用 Set 来查看它们是否是唯一的


const 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', }] }], }] } 


const names = [...JSON.stringify(reduxTree).matchAll(/"name":"(\w+)"/g)].map(m => m[1])

const unique = new Set(names).size === names.length


console.log("Unique?",unique,names.join(","))


查看完整回答
反对 回复 2023-11-02
  • 3 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信