您如何遍历对象数组以创建新对象?

时间:2020-06-13 20:55:24

标签: javascript

我正在尝试遍历来自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对象。

3 个答案:

答案 0 :(得分:0)

您可以按以下方式使用简单的for loop

let res = [
  {'id': 52, 'tag': 'RFS', 'price': 780},
  {'id': 14, 'tag': 'XGH', 'price': 341},
  {'id': 29, 'tag': 'LLP', 'price': 997},
];
let obj = {};
for(let i = 0; i < res.length; i++)
     obj[ res[i]['tag'] ] = {'id':res[i]['id'] , 'price':res[i]['price']};
console.log(obj);

答案 1 :(得分:0)

这是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);

答案 2 :(得分:0)

使用.reducede-structuring

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

var res= data.reduce((acc, {id, price, tag})=>{
  acc[tag] = {id, price};
  return acc
},{});

console.log(res)