【问题标题】:Merge n amount of objects from array into one array based on id [duplicate]根据id将数组中的n个对象合并到一个数组中[重复]
【发布时间】:2020-03-16 22:01:33
【问题描述】:

我正在尝试从下面列出的对象数组中合并 n 个对象。

我尝试使用reduce方法,但我不明白我做错了什么,对高级js方法还是新手。

  const array = [
    {
      data: {
        '1': {
          foo: 'bar',
          test: true
        },
        '4': {
          foo: 'boor'
        }
      }
    },
    {
      data: {
        '1': {
          x: 'o',
          test2: false
        }
      }
    }
  ];

  const result = Object.values(
    array.reduce((r, { data }) => {
      Object.entries(data).forEach(([id, { ...else }]) => {
        r[id] = r[id] || {
          id,
          fooValue: else.foo, // should be `bar` for id `1` and `boor` for id `4`
          xValue: else.x, // should be `o` for id `1` and `undefined` for id `4`
          all: ...else
        };
      });
      return r;
    }, {})
  );

我试图最终得到这样的东西,但我很迷茫。

  [
    {
      id: '1',
      fooValue: 'bar',
      xValue: 'o',
      all: {
        foo: 'bar',
        test: true,
        x: 'o',
        test2: false
      }
    },
    {
      id: '4',
      fooValue: 'boor',
      xValue: undefined,
      all: {
        foo: 'boor'
      }
    }
  ]

【问题讨论】:

  • 你刚刚问了这个问题并得到了答案stackoverflow.com/questions/58966177/…
  • @Titus 是的,但是每个人都忽略了我的编辑,我什至在他们的答案下发表了评论,但没有人回应,我也无法删除我的旧问题,所以不,我没有得到答案。

标签: javascript arrays sorting reduce


【解决方案1】:

const array = [
    {
      data: {
        '1': {
          foo: 'bar',
          test: true
        },
        '4': {
          foo: 'boor'
        }
      }
    },
    {
      data: {
        '1': {
          x: 'o',
          test2: false
        }
      }
    }
  ];
  

let result = Object.values(array.reduce((acc, c) => {
	let list = Object.entries(c.data);
	list.map( o => {
		let key = o[0];
		acc[key] = (acc[key] || {});
		acc[key]['id'] = key;
		acc[key]['fooValue'] = o[1]['foo'];
		acc[key]['xValue'] = o[1]['x'];
		acc[key]['all'] = {...acc[key]['all'], ...o[1]};
     });
	return acc;

}, {}));

console.log(result);

//or 

let result1 = Object.values(array.reduce((acc, c) => {
let list = Object.entries(c.data);
list.map( o => {
	let key = o[0];
	let value = o[1];
	acc[key] = (acc[key] || {});
	acc[key] = {
		id: key,
		fooValue: value['foo'],
		xValue: value['x'],
		all: {...acc[key]['all'], ...o[1]}
	}
 });
return acc;

}, {}));

console.log(result1);

【讨论】:

    【解决方案2】:

    else 是 Javascript 中的关键字。您不能将其用作变量。此外,您应该使用带有花括号的扩展运算符包装变量,以便复制对象

    const result = Object.values(
      array.reduce((r, { data }) => {
        Object.entries(data).forEach(([id, rest ]) => {
          r[id] = r[id] || {
            id: id,
            fooValue: rest.foo, 
            xValue: rest.x,
            all: rest
          };
        });
        return r;
      }, {})
    );
    

    【讨论】:

    • hmm,xValue 对于两个 id 都没有定义
    • all下的第一个对象中也有缺失部分
    • 对不起,我的回答不正确。当使用“或”运算符时,如果表达式为真,它将返回左表达式。因此它永远不会合并具有相同 ID 的第二个对象。这称为短路评估。
    猜你喜欢
    • 2020-03-16
    • 1970-01-01
    • 2021-11-12
    • 2018-12-22
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    相关资源
    最近更新 更多