我想通过使用 Angular 中的 map 和过滤器过滤和映射两个嵌套对象数组来实现以下目标。
关于我的最后一个问题,我有一个解决方案,可以根据特定属性进行过滤。
但我不知道如何根据不同的属性过滤不同的对象。
我想使用 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);
理想情况下,每个对象都包含其唯一的id
和type
,它们决定是否应该进行额外的处理。这就是我的想法。
关于javascript - 根据 Angular 5 中的不同参数过滤并映射对象数组的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62045870/