3 回答

TA贡献1818条经验 获得超8个赞
var mapper = item =>
[item.child
&& (item.check = (item.child = item.child.map(mapper))
.filter(c => c.check).length === item.child.length)
, item][1]
console.dir(arr.map(mapper));
正经版:
var mapper = item => {
// 检查是否到最底一层
if (item.child) {
// 对子元素进行递归映射
item.child = item.child.map(mapper);
// 对映射后的子元素列表检查一下 check === true 的数量是否与子元素数量相等
item.check = item.child.filter(c => c.check).length === item.child.length;
}
// 返回最后一层的元素 / 或是处理后的当前层元素
return item;
}
console.dir(arr.map(mapper));

TA贡献1777条经验 获得超3个赞
提供一个递归的版本
function check (root) {
const _checkNode = x => x.check = x.child ? x.child.every(_checkNode) : x.check
root.forEach(_checkNode)
return root
}

TA贡献1812条经验 获得超5个赞
需求就是遍历所有树节点,需要用到递归,解决代码如下(底部有附上测试数据arr)。另,需求要求从下往上找,其实从上往下找效率是一样,都是要遍历到每个节点,除非你还有其它需求点。
function checkNode(node) {
if (node.child && node.child.length > 0) {//有child的节点才需要check验证
var nodeIsCheck = true;
for (var i = node.child.length - 1; i >= 0; i--) {
var subNode = node.child[i];
if (subNode.child && subNode.child.length > 0) {
checkNode(subNode);
}
nodeIsCheck = nodeIsCheck && subNode.check;
//if (!nodeIsCheck) {
// //注意:如果有子节点是false,则说明当前节点就是false,此时也不能直接break跳出循环,
// //因为要继续递归check验证其它有子节点的子节点
//}
}
node.check = nodeIsCheck;
}
}
//checkNode是从根节点开始递归,如果arr是个数组,则就要遍历去调用。
for (var j = arr.length - 1; j >= 0; j--) {
checkNode(arr[j]);
}
附上我测试的数据arr:
var arr = [
{
check: false,
child: [
{
check: false,
child: [
{
check: true,
},
{
check: true
}
]
},
{
check: false,
child: [
{
check: true,
},
{
check: false,
}
]
},
{
check: true,
child: [
{
check: true,
},
{
check: true,
child: [
{
check: true,
},
{
check: false,
}
]
},
{
check: true,
}
]
}
]
}
]
添加回答
举报