将JavaScript对象减少为格式化对象数组

时间:2018-02-08 02:00:33

标签: javascript arrays recursion formatting javascript-objects

我有一个格式为

的对象数组
{type: number, sub_type: number}

我需要将它们分类为像这样格式化的对象数组

{
  type_id: (type from at least one object in array above),
  sub_types: [
    (all sub types from objects in array above that match this type)
  ]
}

这是我提出的,但我认为有一种更有效的方式。 rawTypes是需要格式化的对象数组,types最终成为格式化对象的数组。

const typeIds = [...new Set(rawTypes.map(val => val.type))];
const types = typeIds.map(val => ({type_id: val, sub_types: [] }));
rawTypes.forEach(obj => {
  let typeIndex = types.reduce((accum, val, i) => val.type_id === obj.type ? i : accum, 0);
  types[typeIndex].sub_types.push(obj.sub_type);
});

我认为更好的解决方案会使用递归,但我无法想到如何做到这一点。

1 个答案:

答案 0 :(得分:0)

看看这种方法

var data = [{type: 5, sub_type: 10}, {type: 5, sub_type: 11}, {type: 6, sub_type: 12}];

var obj = data.reduce((a, c) => {
   var current = a[`type_id_${c.type}`];
   if (current) {
     current.sub_types.push(c.sub_type);
   } else {
     var key = `type_id_${c.type}`;
     a = { ...a, ...{ [key]: {sub_types: [c.sub_type], 'key': c.type} } };
   }
   
   return a; 
}, {});

var array = Object.keys(obj).map((k) => ({ 'type': obj[k].key, 'subtypes': obj[k].sub_types }));

console.log(array)
.as-console-wrapper {
  max-height: 100% !important
}