3 回答

TA貢獻1856條經驗 獲得超5個贊
這是一種遞歸方法,我檢查所有名稱,如果一個名稱出現(xiàn)兩次,我就中斷迭代
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))

TA貢獻2065條經驗 獲得超14個贊
您可以對收集可見名稱的 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));

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(","))
添加回答
舉報