Javascript 分组数组值

Javascript 分组数组值,javascript,ecmascript-6,Javascript,Ecmascript 6,我有以下资料: [ {year: 2017, week: 45}, {year: 2017, week: 46}, {year: 2017, week: 47}, {year: 2017, week: 48}, {year: 2017, week: 50}, {year: 2017, week: 52}, {year: 2018, week: 1}, {year: 2018, week: 2}, {year: 2018, week: 5} ] 但要按年份将其分组为以下格式: [ { 201

我有以下资料:

[
{year: 2017, week: 45},
{year: 2017, week: 46},
{year: 2017, week: 47},
{year: 2017, week: 48},
{year: 2017, week: 50},
{year: 2017, week: 52},
{year: 2018, week: 1},
{year: 2018, week: 2},
{year: 2018, week: 5}
]
但要按年份将其分组为以下格式:

[
  { 2017 : [{
     label: 45, value: 45,
     label: 46, value: 46,
     label: 47, value: 47,
     label: 48, value: 48,
     etc
  },
  { 2018 : [{
     label: 1, value: 1,
     label: 2, value: 2,
     etc
  }]
]

使用Javascript(ES6)实现这一点的最佳方法是什么?我也可以使用lodash/下划线库。

这将对您有所帮助

var-arr=[
{年份:2017,周数:45},
{年份:2017,周数:46},
{年份:2017,周数:47},
{年份:2017,周数:48},
{年份:2017,周数:50},
{年份:2017,周数:52},
{年份:2018,周数:1},
{年份:2018,周数:2},
{年份:2018,周数:5}
]
var groupBy=函数(xs,键){
返回x.reduce(功能(rv,x){
(rv[x[键]]=rv[x[键]| |[])。按(x);
返回rv;
}, {});
};
var arr_res=分组依据(arr,‘年’)

控制台日志(arr_res)使用
reduce

var output = arr.reduce((a, b) => ((a[b.year] = a[b.year] || []).push({
  label: b.week,
  val: b.week
}), a), {});
演示

var-arr=[{
年份:2017年,
星期:45
},
{
年份:2017年,
第周:46
},
{
年份:2017年,
第周:47
},
{
年份:2017年,
第周:48
},
{
年份:2017年,
星期:50
},
{
年份:2017年,
第周:52
},
{
年份:2018年,
周:1
},
{
年份:2018年,
周:2
},
{
年份:2018年,
周:5
}
];
var输出=arr.reduce((a,b)=>(a[b.year]=a[b.year]| |[],a[b.year]。推送({
标签:b.week,
瓦尔:b.week
}),a),{});

控制台日志(输出)您可以使用哈希表并使用对数组的引用来插入新对象

var数据=[{年:2017,周:45},{年:2017,周:46},{年:2017,周:47},{年:2017,周:48},{年:2017,周:50},{年:2017,周:52},{年:2018,周:1},{年:2018,周:2},{年:2018,周:5}],
hash=Object.create(null),
结果=[];
data.forEach(函数(o){
var temp={};
如果(!哈希[o.year]){
哈希值[o.year]=[];
临时[o.year]=散列[o.year];
结果:推送(温度);
}
hash[o.year].push({label:o.week,value:o.week});
});
控制台日志(结果)

作为控制台包装{max height:100%!important;top:0;}
您可以使用
.reduce
数组。from

我对你的要求做了一个假设,因为你的要求是无效的

const res = Array.from(arr.reduce((accum, val) => {
  const grouping = accum.get(val.year) || [];
  grouping.push({ label: val.week, value: val.week });
  accum.set(val.year, grouping);
  return accum;
}, new Map()), kv => ({ [kv[0]]: kv[1] }));

console.log(JSON.stringify(res, null, 2));

请添加有效的结果。(以及您尝试过的内容。)为什么
对象。创建(null)
安装
{}
?:)因为它可能是一些原型作为关键。你应该将
a[b.year]=a[b.year]| |【】,a[b.year]
替换为
(a[b.year]|【】)
@RobG不完全是因为它仍然必须将其分配回
a[b.year]
,但仍然是一个好的位置,我已经包含了相同的位置。做了我需要的事情。谢谢