猿问

js 怎么查找对象的上一级

我现在有一个数据对象如下,
我想从最后一级开始从上查找看下他的每一层的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,

                    }

                ]

            }

        ]

    },

]


慕慕森
浏览 2193回答 3
3回答

弑天下

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

慕森王

提供一个递归的版本function check (root) {  const _checkNode = x => x.check = x.child ? x.child.every(_checkNode) : x.check  root.forEach(_checkNode)  return root}

慕雪6442864

      需求就是遍历所有树节点,需要用到递归,解决代码如下(底部有附上测试数据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,                    }                ]            }        ]    }    ]
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答