代码之家  ›  专栏  ›  技术社区  ›  bob.mazzo

从嵌套的对象数组中删除对象

  •  0
  • bob.mazzo  · 技术社区  · 6 年前

    我有这个小功能(在我的 Angular 7 reduce() ,并在嵌套的对象数组中定位对象。然后,我可以继续动态更新某些属性。

    现在,除了找到这个逻辑,我还想 insert/delete 嵌套数组中的对象。

    问题是:一旦我找到我的对象,我可以推()和/或删除一个对象吗?

    const input={UID:2,GUID:"",LocationName:"USA",ParentLocation:null,subs:[{UID:42,GUID:"",LocationName:"New Jersey",Description:"",subs:[{UID:3,GUID:"",LocationName:"Essex County",ParentLocation:null,"subs":[{UID:4,LocationName:"Newark",ParentLocation:3,"subs":[{"UID":49,"GUID":"","LocationName":"Doctor Smith's Office","LocationType":{"UID":2,"LocationTypeName":"Practice","Description":"other location"},"subs":[{"HostID":38,"HostName":"Ocean Host",}]}]}]}]}]};
    
    const findUIDObj = (uid, parent) => {
      const { UID, subs } = parent;
      if (UID === uid) {
        const { subs, ...rest } = parent;
        return rest;
      }
      if (subs) return subs.reduce((found, child) => found || findUIDObj(uid, child), null);
    };
    console.log(findUIDObj(49, input));
    
    var obj = findUIDObj(49, input);
    delete obj; 

    例如,在我的Angular 7应用程序中,如果我试图 delete

    前/

    var obj = findUIDObj(49, input);
    delete obj; 
    
      'delete' cannot be called on an identifier in strict mode.
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   trincot    6 年前

    delete obj 永远不会做你想做的事情:首先,它甚至不是你输入的对象,因为函数创建了一个 新的 对象,不包括 subs 属性,并返回该属性。但更重要的是, delete 用于删除属性,而不是对象。

    似乎要从其父对象中删除匹配对象 财产。为此,您需要对 潜艇

    记住这一点,lookup函数应该返回在其中找到匹配项以及在哪个索引处找到匹配项的数组。通过这些信息,您可以决定从数组中删除该元素,或者在该索引处插入另一个对象。

    以下是它如何与删除一起工作:

    const input=[{UID:2,GUID:"",LocationName:"USA",ParentLocation:null,subs:[{UID:42,GUID:"",LocationName:"New Jersey",Description:"",subs:[{UID:3,GUID:"",LocationName:"Essex County",ParentLocation:null,"subs":[{UID:4,LocationName:"Newark",ParentLocation:3,"subs":[{"UID":49,"GUID":"","LocationName":"Doctor Smith's Office","LocationType":{"UID":2,"LocationTypeName":"Practice","Description":"other location"},"subs":[{"HostID":38,"HostName":"Ocean Host",}]}]}]}]}]}];
    
    const findUIDObj = (uid, arr) => {
        if (!arr) return;
        const idx = arr.findIndex(obj => obj.UID === uid);
        if (idx > -1) return [arr, idx];
        for (const obj of arr) {
            const result = findUIDObj(uid, obj.subs);
            if (result) return result;
        }
    };
    console.log(findUIDObj(49, input));
    
    const [arr, idx] = findUIDObj(49, input) || [];
    if (arr) {
        arr.splice(idx, 1); // Remove object from its parent array
    }
        2
  •  2
  •   Kyle Vassella    6 年前

    简单地看一下您的代码,我发现您正在使用 const 用于声明数据集合的标识符。我们只使用 常数 对于不变的静态数据,这就是它的用途。因此,首先,这似乎是问题所在。要测试它,请将其更改为 let copy( data ) ,或某个对象,以便传入原始对象,但得到其副本作为回报,而不引用原始对象。这样就不会意外地更改原始对象。要执行此操作,您可以在复制功能中执行此操作: return JSON.parse(JSON.stringify( data )) ;

    这里可能遇到的唯一问题是深度嵌套对象,或者具有循环引用的对象可能会导致问题。我有一个压倒一切的理由 stringify 方法在我编写的小库中管理它。