js 树第归向上找父级修改数据 怎么只能改到一层呢!

let a = [
  {
    key: 1,
    title: '一级',
    parentKey: 0,
    status: {choose: false},
    children: [
      {
        key: 10, title: '一级-0', parentKey: 1, status: {choose: false}, children: [
          {key: 15, title: '一级-0-1', parentKey: 10, status: {choose: false}}
        ]
      },
      {key: 11, title: '一级-1', parentKey: 1, status: {choose: false}},
      {key: 12, title: '一级-2', parentKey: 1, status: {choose: false}},
      {key: 13, title: '一级-3', parentKey: 1, status: {choose: false}},
      {key: 14, title: '一级-4', parentKey: 1, status: {choose: false}}
    ]
  }
];

let parent = (data, obj) => {
  data.forEach(item => {
    if (item.key === obj.parentKey) {
      //改为true
      item.status.choose = true;
      parent(data, item);
    }
    if (item.children && item.children.length) {
      parent(item.children, obj);
    }
  });
};
let obj = {key: 15, title: '一级-0-1', parentKey: 10, status: {choose: false}};
parent(a, obj);
console.log(a);

可是执行结果下来 就只有key 10 修改到了 循环上去 理应 key 1 的choose 为true啊 目前只有 key 修改到了!看了好半会。没理解到为啥不执行上去!

阅读 2k
2 个回答

问题在parent(data, item)这句。
每次递归,data是什么呢?你只往下找了,没把父级传进去呀。

这种已经告诉你parentKey的,直接把层级打平,直接找不就好了。

如果不使用parentKey也可以从上往下,用一个变量记录路径就好了。如果使用递归,那么递归要有返回值判断是否找到,也是可以的。或者转成字符串用正则也可以。

当确定有子集有查找项时,父级key修改为true

let a = [
      {
        key: 1,
        title: '一级',
        parentKey: 0,
        status: { choose: false },
        children: [
          {
            key: 10, title: '一级-0', parentKey: 1, status: { choose: false }, children: [
              { key: 15, title: '一级-0-1', parentKey: 10, status: { choose: false } }
            ]
          },
          { key: 11, title: '一级-1', parentKey: 1, status: { choose: false } },
          { key: 12, title: '一级-2', parentKey: 1, status: { choose: false } },
          { key: 13, title: '一级-3', parentKey: 1, status: { choose: false } },
          { key: 14, title: '一级-4', parentKey: 1, status: { choose: false } }
        ]
      }
     
    ];

    let parent = (data, obj) => {
      data.forEach(item => {
        if (item.key === obj.parentKey) {
          //改为true
          data.key.choose =true //当确定有子集有查找项时,父级key修改为true
          item.status.choose = true;
          parent(data, item);      
        }
        if (item.children && item.children.length) {
          item.status.choose = true;//当确定有子集
          parent(item.children, obj);
        }
      });
    };
    let obj = { key: 15, title: '一级-0-1', parentKey: 10, status: { choose: false } };
    parent(a, obj);
    console.log(a);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题