在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ js 怎么查找對(duì)象的上一級(jí)

js 怎么查找對(duì)象的上一級(jí)

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

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

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

提供一個(gè)遞歸的版本

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) {
        // 對(duì)子元素進(jìn)行遞歸映射
        item.child = item.child.map(mapper);
        // 對(duì)映射后的子元素列表檢查一下 check === true 的數(shù)量是否與子元素?cái)?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
編輯回答
舊城人
   
   需求就是遍歷所有樹(shù)節(jié)點(diǎn),需要用到遞歸,解決代碼如下(底部有附上測(cè)試數(shù)據(jù)arr)。另,需求要求從下往上找,其實(shí)從上往下找效率是一樣,都是要遍歷到每個(gè)節(jié)點(diǎn),除非你還有其它需求點(diǎn)。
   
    function checkNode(node) {
        if (node.child && node.child.length > 0) {//有child的節(jié)點(diǎn)才需要check驗(yàn)證
            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é)點(diǎn)是false,則說(shuō)明當(dāng)前節(jié)點(diǎn)就是false,此時(shí)也不能直接break跳出循環(huán),
                //    //因?yàn)橐^續(xù)遞歸check驗(yàn)證其它有子節(jié)點(diǎn)的子節(jié)點(diǎn)
                //}

            }
            node.check = nodeIsCheck;
        }
    }
    //checkNode是從根節(jié)點(diǎn)開(kāi)始遞歸,如果arr是個(gè)數(shù)組,則就要遍歷去調(diào)用。
    for (var j = arr.length - 1; j >= 0; j--) {
        checkNode(arr[j]);
    }
    
    附上我測(cè)試的數(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