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,
}
]
}
]
}
]
添加回答
舉報