合并对象数组,并使用相同的键合并对象内部的数组

时间:2020-08-01 05:28:28

标签: javascript

所以我有一个名为mergeItems的对象数组,其值等于您在下面看到的值

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
0:
city: [Array(13)]
miles: [Array(13)]
phone: [Array(13)]
photos: [Array(13)]
prices: [Array(13)]
state: [Array(13)]
titles: [Array(13)]
urls: [Array(13)]
who: [Array(13)]
__proto__: Object
1: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
2: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
3: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
4: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
5: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
6: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
7:
city: [Array(0)]
miles: [Array(0)]
phone: [Array(0)]
photos: [Array(0)]
prices: [Array(0)]
state: [Array(0)]
titles: [Array(0)]
urls: [Array(0)]
who: [Array(0)]
__proto__: Object
length: 8
__proto__: Array(0)

它在数组内部有对象,然后每个对象内部都有相同的键。我正在尝试将所有7个数组合并在一起,然后再合并所有城市,英里等键及其内部的数组。

我尝试做


let newData = mergeItems.join();
setState({mainItems: newData});

但是因为那似乎只能合并数组,所以对我没有好处。想知道是否有人可以向我指出如何处理该问题的正确方向。非常感谢=]

我的mergeItems当前值是:

(7) [{…}, {…}, {…}, {…}, {…}, {…}, {…}]
0: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
1: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
2: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
3: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
4: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
5: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
6: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
7: {urls: Array(1), titles: Array(1), miles: Array(1), prices: Array(1), photos: Array(1), …}
length: 8
__proto__: Array(0)

我想要的输出看起来像这样

{urls: Array(7), titles: Array(7), miles: Array(7), prices: Array(7), photos: Array(7), …}
city: (7) [Array(120), Array(0), Array(18), Array(57), Array(1), Array(0), Array(13)]
miles: (7) [Array(120), Array(0), Array(18), Array(57), Array(1), Array(0), Array(13)]
phone: (7) [Array(120), Array(0), Array(18), Array(57), Array(1), Array(0), Array(13)]
photos: (7) [Array(120), Array(0), Array(18), Array(57), Array(1), Array(0), Array(13)]
prices: (7) [Array(120), Array(0), Array(18), Array(57), Array(1), Array(0), Array(13)]
state: (7) [Array(120), Array(0), Array(18), Array(57), Array(1), Array(0), Array(13)]
titles: (7) [Array(120), Array(0), Array(18), Array(57), Array(1), Array(0), Array(13)]
urls: (7) [Array(120), Array(0), Array(18), Array(57), Array(1), Array(0), Array(13)]
who: (7) [Array(120), Array(0), Array(18), Array(57), Array(1), Array(0), Array(13)]
__proto__: Object

2 个答案:

答案 0 :(得分:2)

您似乎想要结束一个对象,该对象的值是数组的数组(而不是每个键的组合数组)。在这种情况下,您可以使用以下方法:

+----+----------+-------+-------+----------------+
| id |   name   | pname | skill | available_date |
+----+----------+-------+-------+----------------+
|  1 | john doe | hms   | php   | 2019-01-02     |
|  1 | john doe | hms   | react | 2019-01-02     |
|  2 | jane doe | hms   | java  | 2020-01-16     |
|  2 | jane doe | IS    | java  | 2020-01-16     |
|  2 | jane doe | hms   | js    | 2020-01-16     |
|  2 | jane doe | IS    | js    | 2020-01-16     |
+----+----------+-------+-------+----------------+

答案 1 :(得分:2)

如果我理解正确,从根本上讲,您有:

const input = [{ foo: 1, bar: 2}, {foo: 3, bar: 4}]

并且您想要:

{ foo: [1, 3], bar: [2, 4] }

换句话说,您想获取事物数组(在这种情况下为对象),然后将其缩小降低为单个值(一个包含其他对象值数组的对象)。事实证明,Javascript有一种完全可以做到这一点的方法,出于某种原因,我使用了该特定动词...

const output = input.reduce((objectWithMergedProperties, currentObject) => {
  objectWithMergedProperties.foo.push(currentObject.foo);
  objectWithMergedProperties.bar.push(currentObject.bar);

  return objectWithMergedProperties;
}, { foo: [], bar: [] });

之所以可行,是因为reduce遍历数组,从objectWithMergedProperties的初始{ foo: [], bar: [] }开始,但是随后每次迭代将其更改为回调内部返回的值。

这使您可以将每个迭代对象的值添加到要构建的输出对象,然后从回调内部返回该对象。完成所有迭代后,该对象最终将从整个reduce调用中返回。

当然,您的示例不是针对具有foobar属性的对象,但是希望这可以演示如何使用reduce来减少任何将具有 any 值的数组放入单个对象。

当然,如果您有很多属性,则始终可以(通过对象的键)进行更多的迭代,而不必对它们进行硬编码:

  objectWithMergedProperties.foo.push(currentObject.foo);
  objectWithMergedProperties.bar.push(currentObject.bar);

可能会变成:

  Object.keys(objectWithMergedProperties)
    .forEach(key => objectWithMergedProperties[key].push(currentObject[key]);