javascript - 如何从另一个数组中的对象属性创建数组
问题描述
我有一个对象数组,我想根据数组中对象的属性将其分解为另一组数组。
例如,我有一些这样的对象:
function Object1(property1, property2, property3){
this.property1 = property1;
this.property2 = property2;
this.property3 = property3;
}
然后,我有一个包含其中几个对象的数组,但是有些对象共享相同的值property1
,例如:
const obj1 = new Object1(id_1, some_value_1, some_value_2);
const obj2 = new Object1(id_2, some_value_2, some_value_2);
const obj3 = new Object1(id_1, some_value_3, some_value_3);
const obj4 = new Object1(id_2, some_value_4, some_value_4);
var objectArray = [obj1, obj2, obj3, obj4];
现在给定这个数组,我想创建基于 的新数组Object1.property1
,所以我最终得到以下数组:
array1 = [obj1, obj3];
array2 = [obj2, obj4];
毫无疑问,这不是一项艰巨的任务,但我无法想到 atm。感谢您的意见。
有一两个警告:我并不总是知道 objectArray 有多大,也不知道该数组中有多少对象共享一个属性,这意味着需要 x 个新数组。
解决方案
为简单起见,我将内联创建数组和对象。
这将分两次完成。首先,将 prop2 和 prop3 按 prop1 分组。然后,过滤掉每个组的唯一元素。
var things = [
{prop1: 1, prop2: 'a', prop3: 'b'},
{prop1: 2, prop2: 'b', prop3: 'b'},
{prop1: 1, prop2: 'c', prop3: 'c'},
{prop1: 2, prop2: 'd', prop3: 'd'}
];
var grouped = things.reduce(function (groups, thing) {
groups[thing.prop1] = groups[thing.prop1] || [];
groups[thing.prop1].push(thing.prop2);
groups[thing.prop1].push(thing.prop3);
return groups;
}, {});
/*
We are now grouped by prop1.
{
1: ["a", "b", "c", "c"],
2: ["b", "b", "d", "d"]
}
*/
var groupedAndUniq = Object.keys(grouped).reduce(function (groups, key) {
groups[key] = [...new Set(grouped[key])];
return groups;
}, {});
console.log(groupedAndUniq);
/*
We are now grouped and unique.
{
1: ["a", "b", "c"],
2: ["b", "d"]
}
*/
推荐阅读
- javascript - 反应全局计数器变量更新脱离上下文
- bash - 如何删除名称附加到其父文件夹名称末尾的子目录
- c++ - C++ 中没有名为“元组”的模板
- javascript - 在 lodash 链接“_.chain()”中返回父对象
- javascript - addEventListener 仅对直接子级
- bootstrap-5 - Bootstraps 5.0 汉堡菜单
- bootstrap-4 - 如果浏览器自动下载内容,则不显示 PDF
- c# - 尝试将 base64String 转换为 IFormFile 会在 C# 中引发 SystemInvalidOperation 异常
- keycloak - 通过 Keycloak 使用远程 IdP 进行第二次登录失败,“用户名或密码无效”
- sql-server - 如何使用 ODBC 连接从 sql server 运行 SSIS 包?