节点映射并将结果过滤到新数组

时间:2018-02-13 01:16:17

标签: javascript arrays

我有一个大脑放屁,请有人指出我正确的方向。

目标:从查询中获取行,将行格式化为以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和/或过滤器?

感谢。

1 个答案:

答案 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)