我正在尝试遍历来自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
对象。
答案 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)
使用.reduce
和de-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)