鍍金池/ 問答/HTML/ js 怎么查找對象的上一級

js 怎么查找對象的上一級

我現(xiàn)在有一個數(shù)據(jù)對象如下,
我想從最后一級開始從上查找看下他的每一層的check是否都滿足為true
如果都滿足就讓他的父級check為true,比如下面這樣
這樣要如何實現(xiàn)

var arr = [
    {
        check: false,
        child: [
            {
                check: false,
                child: [
                    {
                        check: true,
                    },
                    {
                        check: true
                    }
                ]
            },
            {
                check: false,
                child: [
                    {
                        check: true,
                    },
                    {
                        check: false,
                    }
                ]
            }
        ]
    },
]

實現(xiàn)結(jié)果:
var arr = [
    {
        check: false,
        child: [
            {
                check: true,
                child: [
                    {
                        check: true,
                    },
                    {
                        check: true
                    }
                ]
            },
            {
                check: false,
                child: [
                    {
                        check: true,
                    },
                    {
                        check: false,
                    }
                ]
            }
        ]
    },
]
回答
編輯回答
女流氓

提供一個遞歸的版本

function check (root) {
  const _checkNode = x => x.check = x.child ? x.child.every(_checkNode) : x.check
  root.forEach(_checkNode)
  return root
}
2018年4月25日 17:46
編輯回答
久不遇
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));

正經(jīng)版:

var mapper = item => {
    // 檢查是否到最底一層
    if (item.child) {
        // 對子元素進行遞歸映射
        item.child = item.child.map(mapper);
        // 對映射后的子元素列表檢查一下 check === true 的數(shù)量是否與子元素數(shù)量相等
        item.check = item.child.filter(c => c.check).length === item.child.length;
    }
    // 返回最后一層的元素 / 或是處理后的當(dāng)前層元素
    return item;
}
console.dir(arr.map(mapper));
2017年5月31日 04:43
編輯回答
舊城人
   
   需求就是遍歷所有樹節(jié)點,需要用到遞歸,解決代碼如下(底部有附上測試數(shù)據(jù)arr)。另,需求要求從下往上找,其實從上往下找效率是一樣,都是要遍歷到每個節(jié)點,除非你還有其它需求點。
   
    function checkNode(node) {
        if (node.child && node.child.length > 0) {//有child的節(jié)點才需要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) {
                //    //注意:如果有子節(jié)點是false,則說明當(dāng)前節(jié)點就是false,此時也不能直接break跳出循環(huán),
                //    //因為要繼續(xù)遞歸check驗證其它有子節(jié)點的子節(jié)點
                //}

            }
            node.check = nodeIsCheck;
        }
    }
    //checkNode是從根節(jié)點開始遞歸,如果arr是個數(shù)組,則就要遍歷去調(diào)用。
    for (var j = arr.length - 1; j >= 0; j--) {
        checkNode(arr[j]);
    }
    
    附上我測試的數(shù)據(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,
                    }
                ]
            }
        ]
    }
    ]
2018年6月9日 12:32