JS 递归 树 选出 指定的对象

  • 需求:递归出来 未勾选的对象
  • 预期:无法选出 checked: false 的对象,比如下面数据中(西瓜、小布丁、没有味)
  • 数据
[
   {
          title: "parent 1",
          expand: true,
          checked: false,
          children: [
            {
              title: "parent 1-1",
              expand: true,
              checked: false,
              children: [
                {
                  checked: false,
                  title: "西瓜"
                },
                {
                  checked: false,
                  title: "leaf 1-1-2"
                }
              ]
            },
            {
              title: "parent 1-2",

              checked: false,
              expand: true,
              children: [
                {
                  checked: false,
                  title: "leaf 1-2-1"
                },
                {
                  checked: false,
                  title: "leaf 1-2-1"
                }
              ]
            }
          ]
        },
        {
          title: "parent 11",
          checked: false,
          expand: true,
          children: [
            {
              title: "parent 11-1",
              checked: false,
              expand: true,
              children: [
                {
                  checked: false,
                  title: "leaf 11-1-1"
                },
                {
                  checked: false,
                  title: "leaf 11-1-2"
                }
              ]
            },
            {
              title: "adfasdfas",
              checked: false,
              expand: true,
              children: [
                {
                  checked: false,
                  title: "小布丁"
                },
                {
                  checked: false,
                  title: "没有味"
                }
              ]
            }
          ]
        }
]

实现方法:

    function findTarget(source, targetName) {
            if (source && source.length) {
              for (let item of source) {
                if (item.checked === targetName) {
                  console.log(item.title);
                } else if (item.children && item.children.length) {
                  findTarget(item.children, targetName);
                }
              }
            }
          }
          findTarget(this.data2, false);
          for (let i = 0; i < this.data2.length; i++) {
            findTarget(this.data2[i], false);
          }
        }

问题:无法达到预期效果

阅读 2.9k
2 个回答

不知是不是你想要的!

var data = [{

        "title": "parent 1",
        "expand": true,
        "checked": false,
        "children": [{
                "title": "parent 1-1",
                "expand": true,
                "checked": false,
                "children": [{
                        "checked": true,
                        "title": "leaf 1-1-1"
                    },
                    {
                        "checked": false,
                        "title": "leaf 1-1-2"
                    }
                ]
            },
            {
                "title": "parent 1-2",
                "checked": false,
                "expand": true,
                "children": [{
                        "checked": false,
                        "title": "leaf 1-2-1"
                    },
                    {
                        "checked": false,
                        "title": "leaf 1-2-1"
                    }
                ]
            }
        ]
    },
    {

        "title": "parent 11",
        "checked": false,
        "expand": true,
        "children": [{
            "title": "parent 11-1",
            "checked": true,
            "expand": true,
            "children": [{
                    "checked": true,
                    "title": "leaf 11-1-1"
                },
                {
                    "checked": true,
                    "title": "leaf 11-1-2"
                }
            ]
        }]
    }
];


let listArr = [];
const settle = (data) => {
    data.forEach(v => {
        listArr.push({
            label: v.title,
            expand: v.expand || false,
            checked:v.checked
        });
        if (v.children && v.children.length > 0) {
            settle(v.children,)
        }
    });
};
settle(data);
console.log(listArr);

clipboard.png

//同理而已

var data = [
  {
    title: "parent 1",
    expand: true,
    checked: false,
    children: [
      {
        title: "parent 1-1",
        expand: true,
        checked: false,
        children: [
          {
            checked: false,
            title: "西瓜"
          },
          {
            checked: false,
            title: "leaf 1-1-2"
          }
        ]
      },
      {
        title: "parent 1-2",

        checked: false,
        expand: true,
        children: [
          {
            checked: false,
            title: "leaf 1-2-1"
          },
          {
            checked: false,
            title: "leaf 1-2-1"
          }
        ]
      }
    ]
  },
  {
    title: "parent 11",
    checked: false,
    expand: true,
    children: [
      {
        title: "parent 11-1",
        checked: false,
        expand: true,
        children: [
          {
            checked: false,
            title: "leaf 11-1-1"
          },
          {
            checked: false,
            title: "leaf 11-1-2"
          }
        ]
      },
      {
        title: "adfasdfas",
        checked: false,
        expand: true,
        children: [
          {
            checked: false,
            title: "小布丁"
          },
          {
            checked: false,
            title: "没有味"
          }
        ]
      }
    ]
  }
];


let listArr = [];
const settle = (data) => {
  data.forEach(v => {
    if (!v.checked){
      listArr.push({
        title: v.title,
        expand: v.expand || false,
        checked: v.checked
      });
    }
    if (v.children && v.children.length > 0) {
      settle(v.children)
    }
  });
};
settle(data);
console.log(listArr);

clipboard.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题