可以使用递归算法来判断一个 ztree 树形数据中的 name 属性和 spaceNumber 属性是否有重复。具体实现步骤如下:
- 定义一个空对象来存储已经出现过的 name 和 spaceNumber 的值。
let cache = {};
- 定义一个递归函数,接收一个节点作为参数,并对当前节点进行以下处理:
- 判断当前节点的 name 和 spaceNumber 是否都存在,如果不存在则跳过该节点。
- 判断当前节点的 name 和 spaceNumber 是否已经存在于 cache 对象中,如果不存在,则将当前节点的 name 和 spaceNumber 存入 cache 对象中;如果已经存在,则表示当前节点与之前的某个节点重复,返回该节点的内容即可。
- 如果当前节点有子节点,则对子节点进行递归处理。
下面是实现代码:
function checkDuplicate(node) {
if (node.name && node.spaceNumber) {
let key = node.name + '#' + node.spaceNumber;
if (cache[key]) {
return '发现重复值: ' + key;
} else {
cache[key] = true;
}
}
if (node.children && node.children.length > 0) {
for (let i = 0, len = node.children.length; i < len; i++) {
let result = checkDuplicate(node.children[i]);
if (result) {
return result;
}
}
}
return null;
}
let cache = {};
let treeNodes = [{
name: 'test1',
spaceNumber: '123',
children: [{
name: 'test2',
spaceNumber: '456',
children: []
}]
}, {
name: 'test3',
spaceNumber: '789',
children: [{
name: 'test1',
spaceNumber: '123', // 与第一个节点重复
children: []
}]
}];
let result = null;
for (let i = 0, len = treeNodes.length; i < len; i++) {
result = checkDuplicate(treeNodes[i]);
if (result) {
break;
}
}
console.log(result || '没有发现重复值');
上述代码中,我们遍历每个节点,并调用 checkDuplicate 递归函数来对每个节点进行判断。如果在某个节点处发现了重复值,则直接返回提示信息;如果所有节点都被处理完毕仍然没有发现重复值,则返回没有发现重复值的提示。