【问题标题】:filter and map the property of the array of objects based on different parameters in angular 5根据angular 5中的不同参数过滤和映射对象数组的属性
【发布时间】:2020-05-27 14:42:23
【问题描述】:

我想通过使用角度中的映射和过滤器过滤和映射两个嵌套对象数组来实现以下目标。

关于我的最后一个问题,我有一个解决方案,可以根据特定属性进行过滤。

manipulate two array of objects make new array and update the attribute of object1 and add in the new array

但我不确定如何根据不同的属性过滤不同的对象。

我想过滤一些使用 id 属性和一些使用 val 的对象...可以吗?

  • 我想根据 val 比较 type1 和 type2
  • 我想使用 dataid 比较 type1 和 type2 数据对象
  • 我想根据 id 比较 type3/type4..

const obj1 = [
   {
      "val":"type1",
      "removed":"N",
      "id":1,
      "data":[
         {
            "label":"type1-a",
            "removed":"N",
            "dataid":16
         },
         {
            "label":"type1-b",
            "removed":"N",
            "dataid":26
         }
      ]
   },
   {
      "val":"type2",
      "removed":"N",
      "id":2,
      "data":[
         {
            "label":"type2-a",
            "removed":"N",
            "dataid":12
         },
         {
            "label":"type2-b",
            "removed":"N",
            "dataid":34
         }
      ]
   },
   {
      "val":"type3",
      "removed":"N",
      "id":124,
      "label":"type3-label1"
   },
   {
      "val":"type4",
      "removed":"N",
      "id":126,
      "label":"type4-label1"
   },
   {
      "val":"type4",
      "removed":"N",
      "id":128,
      "label":"type4-label2"
   }
]

const obj2 = [
   {
      "val":"type1new",
      "removed":"N",
      "id":1
      "data":[
         {
            "label":"type1new",
            "removed":"N",
            "dataid":16
         },
         {
            "label":"type1-c",
            "removed":null,
            "dataid":null
         },
         {
            "label":"type1-d",
            "removed":null,
            "dataid":null
         }
      ]
   },
   {
      "val":"type3",
      "removed":"N",
      "id":124,
      "label":"type3-label1"
   },
   {
      "val":"type4",
      "removed":"N",
      "id":126,
      "label":"type4-label1"
   },
   {
      "val":"type3",
      "removed":null,
      "id":128,
      "label":"new"
   }
]


result = [
   {
      "val":"type1new",
      "removed":"N",
      "id":1,
      "data":[
         {
            "label":"type1new",
            "removed":"N",
            "dataid":16
         },
         {
            "label":"type1-b",
            "removed":"Y",
            "dataid":26
         },
         {
            "label":"type1-c",
            "removed":null,
            "dataid":null
         },
         {
            "label":"type1-d",
            "removed":null,
            "dataid":null
         }
      ]
   },
   {
      "val":"type2",
      "removed":"Y",
      "data":[
         {
            "label":"type2-a",
            "removed":"N",
            "dataid":12
         },
         {
            "label":"type2-b",
            "removed":"N",
            "dataid":34
         }
      ]
   },
   {
      "val":"type3",
      "removed":"N",
      "id":124,
      "label":"type3-label1"
   },
   {
      "val":"type4",
      "removed":"N",
      "id":126,
      "label":"type4-label1"
   },
   {
      "val":"type4",
      "removed":"Y",
      "id":128,
      "label":"type4-label2"
   },
   {
      "val":"type4",
      "removed":null,
      "id":null,
      "label":"type4-label3"
   },
   {
      "val":"type3",
      "removed":null,
      "id":128,
      "label":"new"
   }
]

---更新了上面的问题---

【问题讨论】:

    标签: javascript angular typescript


    【解决方案1】:

    这就是我将如何解决它

    const obj1 = [
       {
          "val":"type1",
          "removed":"N",
          "data":[
             {
                "label":"type1-a",
                "removed":"N",
                "dataid":16
             },
             {
                "label":"type1-b",
                "removed":"N",
                "dataid":26
             }
          ]
       },
       {
          "val":"type2",
          "removed":"N",
          "data":[
             {
                "label":"type2-a",
                "removed":"N",
                "dataid":12
             },
             {
                "label":"type2-b",
                "removed":"N",
                "dataid":34
             }
          ]
       },
       {
          "val":"type3",
          "removed":"N",
          "id":124,
          "label":"type3-label1"
       },
       {
          "val":"type4",
          "removed":"N",
          "id":126,
          "label":"type4-label1"
       },
       {
          "val":"type4",
          "removed":"N",
          "id":128,
          "label":"type4-label2"
       }
    ]
    
    const obj2 = [
       {
          "val":"type1",
          "removed":"N",
          "data":[
             {
                "label":"type1-a",
                "removed":"N",
                "dataid":16
             },
             {
                "label":"type1-c",
                "removed":null,
                "dataid":null
             },
             {
                "label":"type1-d",
                "removed":null,
                "dataid":null
             }
          ]
       },
       {
          "val":"type3",
          "removed":"N",
          "id":124,
          "label":"type3-label1"
       },
       {
          "val":"type4",
          "removed":"N",
          "id":126,
          "label":"type4-label1"
       },
       {
          "val":"type3",
          "removed":null,
          "id":128,
          "label":"new"
       }
    ]
    
    
    const getIdentity = (obj) => {
      if(["type1", "type2"].includes(obj.val)) {
        return obj.val;
      }
    
      if(["type3", "type4"].includes(obj.val)) {
        return obj.id + obj.val;
      }
    }
    
    const result = obj1.reduce((acc, obj) => {
    
      const similarObj = obj2.find(nobj => getIdentity(nobj) === getIdentity(obj));
      
      if(["type1", "type2"].includes(obj.val) && similarObj) {
        const data = obj.data.reduce((nacc, item) => {
          
          const similarItem = similarObj.data.find(pr => pr.dataid === item.dataid);
          
          if(!similarItem) {
    
            return [...nacc, {...item, removed: 'Y'}];
          }
          
          const newItem = {
            ...item,
            ...similarItem
          }
          
          return [...nacc, newItem];
        }, similarObj.data.filter(pr => !obj.data.some(npr => pr.dataid === npr.dataid)))
        
        const newObj = {
          ...obj,
          ...similarObj,
          data
        }
        
        return [...acc, newObj];
      }
      
      if(!similarObj) {
        acc = [...acc, {
          ...obj,
          removed: "Y"
        }];
        
        return acc;
      }
      
      return [...acc, obj];
    
    }, obj2.filter(obj => !obj1.some(nobj => getIdentity(obj) === getIdentity(nobj))))
    
    result.sort((prev, next) => prev.val > next.val ? 1 : -1);
    
    console.log(result);

    理想情况下,每个对象都将包含其唯一的idtype,它们决定是否应该进行额外处理。这是我的想法。

    【讨论】:

    • 感谢所有答案...它适用于所有条件,除非 object2 将 object1 现有 id 中的 val 更新为此 {"val":"type3","re​​moved":null, "id" :128, "label":"new label"}... 结果没有更新 { "val":"type4", "removed":"Y", "id":128,"label":"type4 -label2"}
    • 规则是当对象的类型为type3,type4 时,通过id 比较对象。现在不是这样了吗?
    • 我修改了从对象return obj.id + obj.val;获取身份的函数。它似乎可以处理提到的情况,但我不确定其他情况
    • 非常感谢.. 现在我有了所有类型的唯一 ID。
    • 您必须更改 getIdentity 函数,因为它会检查 val 属性中的内容。我不确定reduce 的实现。
    猜你喜欢
    • 2021-04-19
    • 2020-01-10
    • 1970-01-01
    • 2020-02-29
    • 2018-07-06
    • 2018-12-25
    • 2020-12-03
    • 1970-01-01
    • 2021-03-20
    相关资源
    最近更新 更多