首页 > 解决方案 > 你如何遍历一个对象数组来创建一个新对象?

问题描述

我正在尝试遍历来自 WebSocket 连接的消息(这是一个对象数组)以创建一个新对象。这是原始数组:

[
  {'id': 52, 'tag': 'RFS', 'price': 780},
  {'id': 14, 'tag': 'XGH', 'price': 341},
  {'id': 29, 'tag': 'LLP', 'price': 997},
]

我正在尝试使用这个数组来创建一个对象,并以tag为键:

{
  'RFS': {'id': 52, 'price': 780},
  'XGH': {'id': 14, 'price': 341},
  'LLP': {'id': 29, 'price': 997},
}

让这个对象= obj。在 Python 中,我可以执行以下操作:

>>> new_obj = {i['tag']: {'id': i['id'], 'price': i['price']} for i in obj}
>>> new_obj
{'RFS': {'id': 52, 'price': 780}, 'XGH': {'id': 14, 'price': 341}, 'LLP': {'id': 29, 'price': 997}}

我将如何在 JS 中做这样的事情?我尝试过使用该map功能,但无济于事。我也尝试使用reduce

var result = obj.reduce(function(new_obj, i) {
  new_obj[i.tag] = {'id': i.id, 'price': i.price};
  return new_obj;
}, {});

编辑:reduce上面的方法对我来说是不成功的。我可能错过了一些愚蠢的东西,但控制台告诉我Each child in a list should have a unique "key" prop.,它返回一个undefined对象。

标签: javascript

解决方案


这是一个解决方案reduce

const input = [
  {'id': 52, 'tag': 'RFS', 'price': 780},
  {'id': 14, 'tag': 'XGH', 'price': 341},
  {'id': 29, 'tag': 'LLP', 'price': 997},
];

const output = input.reduce((acc, obj) => ({ ...acc, [obj.tag]: { id: obj.id, price: obj.price }}), {});

console.log(output);


推荐阅读