您有两个任务,过滤和查找不同的项目(实际上是:分组)。
所以当我们定义两个函数时,一个用于通过给定属性进行过滤:
const filterByProp =
(prop) =>
(value) =>
(items) =>
items.filter((item) => item[prop] === value);
还有一个用于通过给定属性查找不同的(在这种情况下:每个值的每个第一项):
const distinctByProp =
(prop) =>
(items) =>
Object.values(items.reduce((group, item) => {
if (!group.hasOwnProperty(item[prop])) group[item[prop]] = item;
return group;
}, {}));
我们可以的
const onlyClassC = filterByProp("Class")("Class C");
const distinctByGroup = distinctByProp("Group");
const filtered = distinctByGroup(onlyClassC(result));
并获得filtered 为:
[
{
"Class": "Class C",
"Group": "Group A",
"Value": 1
},
{
"Class": "Class C",
"Group": "Group B",
"Value": 10
}
]
如果您想要每个不同组的最后一项而不是第一项,请从 distinctByProp 中删除 if (!group.hasOwnProperty(item[prop]))。
const filterByProp =
(prop) =>
(value) =>
(items) =>
items.filter((item) => item[prop] === value);
const distinctByProp =
(prop) =>
(items) =>
Object.values(items.reduce((group, item) => {
if (!group.hasOwnProperty(item[prop])) group[item[prop]] = item;
return group;
}, {}));
// -----------------------------------------------------------------------
const onlyClassC = filterByProp("Class")("Class C");
const distinctByGroup = distinctByProp("Group");
// -----------------------------------------------------------------------
var result = [
{
"Class": "Class C",
"Group": "Group A",
"Value": 1
},
{
"Class": "Class C",
"Group": "Group A",
"Value": 2
},
{
"Class": "Class A",
"Group": "Group B",
"Value": 2
},
{
"Class": "Class C",
"Group": "Group B",
"Value": 10
}
];
const filtered = distinctByGroup(onlyClassC(result));
console.log(filtered);