javascript - 根据 Angular 5 中的不同参数过滤并映射对象数组的属性

标签 javascript angular typescript

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

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

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"
   }
]

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

最佳答案

这是我解决这个问题的方法

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,它们决定是否应该进行额外的处理。这就是我的想法。

关于javascript - 根据 Angular 5 中的不同参数过滤并映射对象数组的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62045870/

相关文章:

typescript - 在一个 Electron 应用程序中,仅在 main.ts 中导入 libp2p 会导致 "self is not defined"

html - 如何使用 Angular 在 Html 中显示日期?

Javascript 编码 - 良好实践/标准

javascript - 如何使用 knockout.js 设置数据绑定(bind)到 SVG 图像?

javascript - 使用 .getJSON 获取 Play 商店应用详细信息时出现跨源 block 请求 [CORS] 错误

javascript - 除 Angular 4 的输入外,所有页面上都有阴影

javascript - 用户提交弹出表单时发送多个ajax调用

javascript - 将 FirestoreCollection 转换为数组?

java - 在 Tomcat 中运行的 Square Java SDK 无法找到 Jersey 通用类

javascript - Angular2 + 引导网格