javascript - 在对象数组中选择唯一项
问题描述
假设我有以下对象数组
[{a:1,b:2,c:4}, {a:3,b:4,c:7}, {a:7,b:10,c:10}, {a:1, b:2,c:4}]
如何选择此数组中的唯一项目。我需要比较两个字段(仅 a、b,不包括 c),并且我看到的示例显示了一个仅采用单个字段的地图。
解决方案
a
您可以使用嵌套过滤器,并检查具有相同和的匹配元素的数量b
为 1:
const input = [{a:1,b:2,c:4}, {a:3,b:4,c:7}, {a:7,b:10,c:10}, {a:1, b:2,c:4}];
const output = input.filter(
({ a, b }) => input.filter(obj => obj.a === a && obj.b === b).length === 1
);
console.log(output);
相反,为了O(N)
复杂性,减少到一个由 索引的对象num_num
,或类似的东西,然后只选择其中包含一个项目的值:
const input = [{a:1,b:2,c:4}, {a:3,b:4,c:7}, {a:7,b:10,c:10}, {a:1, b:2,c:4}];
const inputByAB = input.reduce((accum, obj) => {
const key = `${obj.a}_${obj.b}`;
if (!accum[key]) {
accum[key] = [];
}
accum[key].push(obj);
return accum;
}, {});
const output = Object.values(inputByAB)
.filter(arr => arr.length === 1)
.flat();
console.log(output);
如果您不能使用.flat
,请改为使用 concat :
const input = [{a:1,b:2,c:4}, {a:3,b:4,c:7}, {a:7,b:10,c:10}, {a:1, b:2,c:4}];
const inputByAB = input.reduce((accum, obj) => {
const key = `${obj.a}_${obj.b}`;
if (!accum[key]) {
accum[key] = [];
}
accum[key].push(obj);
return accum;
}, {});
const output = [].concat(...
Object.values(inputByAB)
.filter(arr => arr.length === 1)
);
console.log(output);
推荐阅读
- redis - 具有 3 节点集群的 Redis 不断切换主节点
- mysql - Spring Data REST 多对多失败:一对多工作
- pdf - 如何编写用户配置文件以在 Mac/Windows 上使用 VS Code
- c++ - QML Connections 在 Qt6 中无法正常运行
- javascript - 尝试手动向 EditorJS 添加新块时出错
- r - 我正在遍历一个向量并尝试将每个元素用作数据框列名。如何在 df3$x 中的 $ 之后读取每个元素?
- c# - 移动时角色进入斜墙内
- python - 更改预训练模型的参数
- r - 将一组整数分成两个大致相同太阳的子组
- bitbucket - CI-CD 和版本管理