Javascript 重新构造对象数组,然后对对象进行分组
所以我找到了一个解决方案,但我仍在学习,觉得我的解决方案太长了。它没有使用所有ES6,可能会更好。我希望得到任何反馈和/或建议 数据如下所示:Javascript 重新构造对象数组,然后对对象进行分组,javascript,arrays,object,ecmascript-6,reduce,Javascript,Arrays,Object,Ecmascript 6,Reduce,所以我找到了一个解决方案,但我仍在学习,觉得我的解决方案太长了。它没有使用所有ES6,可能会更好。我希望得到任何反馈和/或建议 数据如下所示: const formattedWorkbook = [ { "year": 2016, "mainHeaderEnglish": "Pearls of Wisdom", "categor
const formattedWorkbook =
[
{
"year": 2016,
"mainHeaderEnglish": "Pearls of Wisdom",
"categoryCode": 3,
},
{
"year": 2017,
"mainHeaderEnglish": "VENuS Satellite",
"categoryCode": 2,
},
{
"year": 2017,
"mainHeaderEnglish": "Hope for millions",
"categoryCode": 1,
},
{
"year": 2012,
"mainHeaderEnglish": "green electricity Pioneer",
"categoryCode": 2
}
]
const formattedWorkbook =
[
{
"year": 2016,
"value: [
{"mainHeaderEnglish": "Pearls of Wisdom", "categoryCode": 3,}
]
},
{
"year": 2017,
"value":[
{"mainHeaderEnglish": "VENuS Satellite", "categoryCode": 2},
{"mainHeaderEnglish": "Hope for millions", "categoryCode": 1}
]
},
{
"year": 2012,
"value": [
{"mainHeaderEnglish": "green electricity Pioneer", "categoryCode": 2}
]
}
]
数据需要如下所示:
const formattedWorkbook =
[
{
"year": 2016,
"mainHeaderEnglish": "Pearls of Wisdom",
"categoryCode": 3,
},
{
"year": 2017,
"mainHeaderEnglish": "VENuS Satellite",
"categoryCode": 2,
},
{
"year": 2017,
"mainHeaderEnglish": "Hope for millions",
"categoryCode": 1,
},
{
"year": 2012,
"mainHeaderEnglish": "green electricity Pioneer",
"categoryCode": 2
}
]
const formattedWorkbook =
[
{
"year": 2016,
"value: [
{"mainHeaderEnglish": "Pearls of Wisdom", "categoryCode": 3,}
]
},
{
"year": 2017,
"value":[
{"mainHeaderEnglish": "VENuS Satellite", "categoryCode": 2},
{"mainHeaderEnglish": "Hope for millions", "categoryCode": 1}
]
},
{
"year": 2012,
"value": [
{"mainHeaderEnglish": "green electricity Pioneer", "categoryCode": 2}
]
}
]
这是我的有效解决方案,但我认为可能会更好:
let transformedWorkbook = formattedWorkbook.map(function (obj) {
const result = {
year: obj.year,
value: []
}
for (let year in obj) {
if (obj.hasOwnProperty(year) && year !== "year") {
result.value.push({ [year]: obj[year] });
}
}
result.value = [Object.assign({}, ...result.value)]
return result;
});
const newWorkbook = new Map(transformedWorkbook.map(({ year, value }) => [year, { year, value: [] }]));
for (let { year, value } of transformedWorkbook) {
newWorkbook.get(year).value.push(...[value].flat())
};
console.log([...newWorkbook.values()]);
您可以使用来根据年份对阵列数据进行分组
:
const formatted工作簿=
[
{
“年份”:2016年,
“主流英语”:“智慧之珠”,
“类别代码”:3,
},
{
“年份”:2017年,
“主脑英语”:“金星卫星”,
“类别代码”:2,
},
{
“年份”:2017年,
“主流英语”:“百万人的希望”,
“类别代码”:1,
},
{
“年份”:2012年,
“主流英语”:“绿色电力先锋”,
“类别代码”:2
}
]
让结果=格式化工作簿。减少((acc,cur)=>{
让{year,…rest}=cur;
设ex=acc.find(x=>x.year==year);
如果(!ex){
ex={年,值:[]};
加速推力(ex);
}
ex.value.push(剩余);
返回acc;
}, [])
控制台日志(结果)
您仍然可以使用映射
,但从对象中取出年份
,并使用分组结果映射新对象
分块:
- 获取一个iterable(如或),其中实现了一个映射函数,并返回一个数组
- 要获得分组数据集,可以使用累加器(如
的一个实例)对给定的对象数组进行迭代 要从对象获取属性并保留其余属性Map
你可以拿一张{ year, ...o }
,然后得到一张支票。现在您有两个部分,用于分组的所需属性和作为值收集的其余部分 从实例中获取一个值并存储该值 如果没有获取数组作为值,则需要使用默认值年的
with,返回第一个值,与数组类似,但不返回未定义的m.get(year) || []
此值将与实际对象一起放入新数组中
作为[...(m.get(year) || []), o]
映射的新值
- 最后是
Array.from的映射函数
对给定的([year, value]) => ({ year, value })
的键和值进行解构,并生成具有新结果的新对象Map
const formattedWorkbook=[{年份:2016,主要英语:“智慧之珠”,类别代码:3},{年份:2017,主要英语:“金星卫星”,类别代码:2},{年份:2017,主要英语:“百万希望”,类别代码:1},{年份:2012,主要英语:“绿色电力先锋”,类别代码:2},
结果=Array.from(
格式化工作簿.reduce((m,{year,…o})=>
m、 设置(年份,[…(m.get(year)| |[]),o]),新地图,
([year,value])=>({year,value})
);
控制台日志(结果)代码>
.as控制台包装{max height:100%!important;top:0;}
您可以使用:
_.map(formattedWorkbook, el => {
return {
year: el.year,
value: {
mainHeaderEnglish: el.mainHeaderEnglish,
categoryCode: el.categoryCode
}
}
});
如果您更喜欢本机javascript函数:
formattedWorkbook.map(el => {
return {
year: el.year,
value: {
mainHeaderEnglish: el.mainHeaderEnglish,
categoryCode: el.categoryCode
}
}
});
真的很短很优雅,但我非常激动你太棒了,谢谢你花时间写出来。这不是我要求的输出,年份需要分组,同一年的值应该放在对象内的值数组中