从大列表中提取数据

时间:2018-08-03 10:57:25

标签: javascript math

我有一个像下面这样的列表:

var list = [
  {
    id:1,
    name: 'bss',
    type_a: 1, 
  },
  {
    id:2,
    name: 'bss',
    type_a: 1,
  },
  {
    id:3,
    name: 'bss',
    type_a: 2,
  },
  {
    id:4,
    name: 'bss',
    type_a: 2,
  },
  {
    id:6,
    name: 'bss',
    type_a: 2,
  },

  {
    id:8,
    name: 'bss',
    type_a: 5,
  },

  {
    id:9,
    name: 'bss',
    type_a: 8,
  },
  ...
]

您看到列表,列表中的项目具有type_a参数:

我想提取type_a,并聚合相同的type_a,如下所示:

{
  8: [  // the 8 is `type_a`
    {
        id:9,
        name: 'bss',
        type_a: 8,
      },
    ], 
  },
  5: [
    {
        id:8,
        name: 'bss',
        type_a: 5,
      },
  ] 
  ...
}

是否有更有效的功能来实现这一目标?

我可以使用两个for循环来实现这一点,第一个是搜集type_a类型,另一个是列表(如果等于type_a项)。

1 个答案:

答案 0 :(得分:0)

您可以将Array.reduce()用于该输出:

var list = [
  {
    id:1,
    name: 'bss',
    type_a: 1, 
  },
  {
    id:2,
    name: 'bss',
    type_a: 1,
  },
  {
    id:3,
    name: 'bss',
    type_a: 2,
  },
  {
    id:4,
    name: 'bss',
    type_a: 2,
  },
  {
    id:6,
    name: 'bss',
    type_a: 2,
  },

  {
    id:8,
    name: 'bss',
    type_a: 5,
  },

  {
    id:9,
    name: 'bss',
    type_a: 8,
  }
];

var res = list.reduce((acc, item)=>{
  if(acc[item.type_a]){
    acc[item.type_a].push(item);
    return acc;
  }
  acc[item.type_a] = [];
  acc[item.type_a].push(item);
  return acc;
}, {});
console.log(res);