我有一个大脑放屁,请有人指出我正确的方向。
目标:从查询中获取行,将行格式化为以ID为索引的新坐标数组。
来自查询的示例响应: 这是一个从mysql查询返回的对象数组。清除了可能的混乱。
[
{
id: 2031,
store_id: 12,
latitude: '40.734479',
longitude: '-73.998943'
},
{
id: 2041,
store_id: 12,
latitude: '40.732912',
longitude: '-74.000083'
},
{
id: 2051,
store_id: 14,
latitude: '40.731053',
longitude: '-74.001423'
},
{
id: 2061,
store_id: 14,
latitude: '40.729696',
longitude: '-74.002186'
},
{
id: 2071,
store_id: 14,
latitude: '40.729121',
longitude: '-74.002473'
}
]
期望的输出:
{
12:[
{ latitude: '40.734479', longitude: '-73.998943' },
{ latitude: '40.732912', longitude: '-74.000083' }
],
14:[
{ latitude: '40.731053', longitude: '-74.001423'},
{ latitude: '40.729696', longitude: '-74.002186'},
{ latitude: '40.729121', longitude: '-74.002473'}
]
}
以前,利用for循环,我检查对象是否具有属性,然后创建属性,如果没有,则填充数组。
有没有更好的方法来实现这一点,使用map和reduce和/或过滤器?
感谢。
答案 0 :(得分:3)
您可以使用Array.reduce
:
const myArr = [{
id: 2031,
store_id: 12,
latitude: '40.734479',
longitude: '-73.998943'
}, {
id: 2041,
store_id: 12,
latitude: '40.732912',
longitude: '-74.000083'
}, {
id: 2051,
store_id: 14,
latitude: '40.731053',
longitude: '-74.001423'
}, {
id: 2061,
store_id: 14,
latitude: '40.729696',
longitude: '-74.002186'
}, {
id: 2071,
store_id: 14,
latitude: '40.729121',
longitude: '-74.002473'
}];
const merged = myArr.reduce((merged, item) => {
if (!merged[item.store_id]) merged[item.store_id] = [];
merged[item.store_id].push({
latitude: item.latitude,
longitude: item.longitude,
});
return merged;
}, {});
console.log(merged)