javascript - 如何过滤对象数组并根据特定属性变得不同
问题描述
我有以下数组,我想根据一个属性进行过滤并与另一个属性不同。我设法让它工作,但有没有更清洁的方法来实现这一点?
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
}
];
result = result.reduce((x, {
Class,
Group,
Value
}) => {
Class.includes("Class C") && x.push({
Class,
Group,
Value
});
return x;
}, []);
console.log(result);
result = [...new Map(result.map(item => [item["Group"], item])).values()];
console.log("Expected Result:");
console.log(result);
解决方案
您有两个任务,过滤和查找不同的项目(实际上是:分组)。
因此,当我们定义两个函数时,一个用于通过给定属性进行过滤:
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
}
]
如果您想要每个不同组的最后一项而不是第一项,请删除if (!group.hasOwnProperty(item[prop]))
from distinctByProp
。
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);
推荐阅读
- c++ - 使用私有继承的超出范围错误
- c# - 按对象属性对类对象进行基本排序
- javascript - 发布到服务器后如何控制台日志或警告数据
- javascript - 如何使用 fft.js 和 node.js 从音频 wav 文件中获取频谱
- c# - 没有得到如何使用充值供应商 api 调用我的回调 URL
- python - 循环拉取文件大小、文件夹大小和目录大小?
- git - 使用代码清理修改拉取请求中的两个先前提交
- opencv - 非图像基本结构中的 OpenCV 浮点数与双精度数
- vb.net - Visual basic .NET - 显示所选月份的天数
- go - 在银杏测试中检查非空值的正确方法