Object对象相同name分一组

//(是从表单获取的数据,Form name需要不同没办法只能获取到这样的)
{  
    name0:aaa,  
    address0:bbb,
    city0: 44,
    name1:eee,
    address1:fff, 
    name2:eede,
    address2:fffd,
    city2: 7,
}

有什么好的方法,把上面的对象转换成下面数组的格式

[
    {
       name: aaa,
       address: bbb,
       city: 44
    },
    {
       name: eee,
       address: fff
    },
    {
       name: eede,
       address: fffd,
       city: 7
    }
]
阅读 1.6k
1 个回答
var data = {  
    name0: 'aaa',
    address0:'bbb',
    city0: 44,
    name1: 'eee',
    address1: 'fff', 
    name2: 'eede',
    address2: 'fffd',
    city2: 7,
}

// 方法一
Object.values(Object.keys(data).reduce((res, key) => {
  const n = key.match(/\d+$/)[0];
  const k = key.replace(/\d+$/, '');
  const v = data[key];
  const item = res[n];

  if(item) item[k] = v;
  else res[n] = {[k]: v};
  return res;
}, {}))

// 方法二
Object.keys(data).reduce((res, key) => {
  const n = key.match(/\d+$/)[0];
  const k = key.replace(/\d+$/, '');
  const v = data[key];
  const item = res[n];

  if(item) item[k] = v;
  else res[n] = {[k]: v};
  return res;
}, []).filter(Boolean)

两个方法其实只是细微的差异,原理都是一样的,数组其实也可以看做是key为数值的对象,所以两方法本质上没什么区别。数组最后的过滤只是考虑到数值可能跳跃,结合实际情况可以舍弃。

ps:贴代码规范点,能给回答的人省很多事【中文冒号、中文逗号、字符引号】

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题