删除基于属性的JSON对象

问题描述 投票:1回答:2

我有反应,我有一个名为newtreeData变量,它看起来像工作:

var newTreeData = {
        name: submitted_title,
        resource_link: submitted_resource_link,
        details: submitted_details,
        uuid: submitted_uuid,
        website_image: submitted_website_img,
        children: [
          {
            name: "Edit and save",
            resource_link: "uh",
            uuid: uuid.v4(),
            details: "hi",
            website_image:
              "https://cdn3.iconfinder.com/data/icons/harmonicons-06/64/plus-circle-512.png",
            children: [{...}, {}, ...]
          },




          {
            name: "Edit and save",
            resource_link: "uh",
            uuid: uuid.v4(),
            details: "hi",
            website_image:
              "https://cdn3.iconfinder.com/data/icons/harmonicons-06/64/plus-circle-512.png"
          }
        ]
      };

该生产线children: [{...}, {}]只是表示newTreeData的孩子能有哪些可以有小孩儿...

不管怎么说,我写了一个方法名findUUIDthenDelete应在伪做到:if(object.uuid == toFindUUID) then delete object,这里是为findUUIDthenDelete的完整代码:

  findUUIDthenDelete = (orig_data, to_delete_uuid) => {
     var targetIsFound = false;
     if (orig_data.uuid == to_delete_uuid) {
        targetIsFound = true;
     }

     if (targetIsFound == false) {
        if (orig_data.children === undefined) {
     } else {
    //if target not found, run recursion
       orig_data.children.map(eachChildren =>
         this.findUUIDthenDelete(eachChildren, to_delete_uuid)
        );
      }
    } else {
      console.log(orig_data, "this is the child ");
      console.log(orig_data.parent, "is found, deleting its parent");
      delete orig_data

    } 
  };

正如你所看到的这个方法是两个部分:首先,我找到它有,我们正在努力寻找(可能与一些递归),然后删除该对象的UUID的对象。不过,现在我得到,因为这样做delete orig_data的“删除局部变量严格模式等等等等”的错误。任何见解,以任何变通办法到错误或解决这个的一些全新的方式?也真诚的道歉,如果有一个显而易见的解决方案我出精力和无法的想什么,此刻算法。

javascript json reactjs
2个回答
3
投票

这应该这样做:

function findUUIDthenDelete(tree, uuid) {
  if (!tree.children) return;
  tree.children = tree.children.filter(c => c.uuid !== uuid);
  tree.children.forEach(c => findUUIDthenDelete(c, uuid));
}

应该是不言自明。首先,如果当前节点没有孩子,立刻退出。 接下来,有可能从孩子阵列如果uuid匹配使用filter()删除一个孩子。 最后,递归。


1
投票

好吧我承认这竟然是比我想象的更复杂,但下面的解决方案将工作,如果你可以使用一成不变的。本质上,它走你的对象,并收集的路径,找到具有UUID,然后一旦做到这一点,它会删除它的对象。

const testMap = Immutable.fromJS({
  uuid: 1,
  children: [{
    uuid: 2,
    children: [{
        uuid: 3,
        children:[{
          uuid: 8
          }]
      },
      {
        uuid: 4
      },
      {
        uuid: 5
      },
    ]
  },
  {
    uuid: 7
  }]
});

function findPath(checkMap, uuid, pathMap, currentIndex) {
  if (checkMap.has('uuid') && checkMap.get('uuid') === uuid) {
    const updatePathMap = pathMap.get('path').push(currentIndex);
    return new Immutable.Map({
      found: true,
      path: pathMap.get('path').push(currentIndex)
    });
  } else {
    if (checkMap.has('children') && checkMap.get('children').size > 0) {
      for (let i = 0; i < checkMap.get('children').size; i++) {
        const child = checkMap.get('children').get(i);
        const checkChildPath = findPath(child, uuid, pathMap, i);
        if (checkChildPath.get('found') === true) {
          let updatePath =  checkChildPath.get('path').push('children');
          updatePath = updatePath.push(currentIndex);
          return new Immutable.Map({
            found: true,
            path: updatePath
          });
        }
      }
    }
    return pathMap;
  }
}

const testPath = findPath(testMap, 7, new Immutable.Map({
  found: false,
  path: new Immutable.List()
}), 0);

console.info(testPath);

const testPath2 = findPath(testMap, 8, new Immutable.Map({
  found: false,
  path: new Immutable.List()
}), 0);

console.info(testPath2);

if (testPath2.get('found') === true) {

  const path = testPath2.get('path');
  if (path.size === 1 && path.get(0) === 0) {
    // Your highlest level map has the uuid
  } else {
    const truePath = path.shift();
    const cleanedUpMap = testMap.removeIn(truePath);
    console.info(cleanedUpMap);
  }
    
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/immutable/3.8.2/immutable.js"></script>
© www.soinside.com 2019 - 2024. All rights reserved.