首页 > 解决方案 > 如何从另一个数组中的对象属性创建数组

问题描述

我有一个对象数组,我想根据数组中对象的属性将其分解为另一组数组。

例如,我有一些这样的对象:

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 个新数组。

标签: javascriptarrays

解决方案


为简单起见,我将内联创建数组和对象。

这将分两次完成。首先,将 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"]
}
*/

推荐阅读