亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

js 怎么查找對象的上一級

js 怎么查找對象的上一級

慕慕森 2019-03-15 18:15:50
我現在有一個數據對象如下,我想從最后一級開始從上查找看下他的每一層的check是否都滿足為true如果都滿足就讓他的父級check為true,比如下面這樣這樣要如何實現var arr = [    {        check: false,        child: [            {                check: false,                child: [                    {                        check: true,                    },                    {                        check: true                    }                ]            },            {                check: false,                child: [                    {                        check: true,                    },                    {                        check: false,                    }                ]            }        ]    },]實現結果:var arr = [    {        check: false,        child: [            {                check: true,                child: [                    {                        check: true,                    },                    {                        check: true                    }                ]            },            {                check: false,                child: [                    {                        check: true,                    },                    {                        check: false,                    }                ]            }        ]    },]
查看完整描述

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));


查看完整回答
反對 回復 2019-03-23
?
慕森王

TA貢獻1777條經驗 獲得超3個贊

提供一個遞歸的版本


function check (root) {

  const _checkNode = x => x.check = x.child ? x.child.every(_checkNode) : x.check

  root.forEach(_checkNode)

  return root

}


查看完整回答
反對 回復 2019-03-23
?
慕雪6442864

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,

                    }

                ]

            }

        ]

    }

    ]


查看完整回答
反對 回復 2019-03-23
  • 3 回答
  • 0 關注
  • 2232 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號