为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 2191 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号