我需要一个帮助。我需要使用Angular.js / Javascript以一种特定的格式按照键值对数组进行排序。我正在解释下面的数组。
var stepsModel=[
{'day_id':2,'day_name':'Tuesday','image':"1.png"},
{'day_id':2,'day_name':'Tuesday','image':"2.png"},
{'day_id':2,'day_name':'Tuesday','image':"3.png"},
{'day_id':3,'day_name':'Wednsday','image':"1.png"},
{'day_id':3,'day_name':'Wednsday','image':"2.png"}
]
以上是我给定的array.i需要根据day_id
对其进行排序。我的预期输出如下所示。
var output = [
{
'day_id': 2,
'day_name': 'Tuesday',
'special': [
{ 'image': 1. png },
{ 'image': 2. png },
{ 'image': 3. png }
]
},
{
'day_id': 3,
'day_name': 'Wednsday',
'special': [
{ 'image': 1. png },
{ 'image': 2. png }
]
}
]
请帮助我对给定的数组进行排序并获得如上所示的结果。
答案 0 :(得分:2)
您可以使用哈希表将图像正确分配到日期。
可选,如果您想使用紧凑款式,则可以使用Array#reduce
代替Array#forEach
。
var stepsModel = [
{ 'day_id': 2, 'day_name': 'Tuesday', 'image': "1.png" },
{ 'day_id': 2, 'day_name': 'Tuesday', 'image': "2.png" },
{ 'day_id': 2, 'day_name': 'Tuesday', 'image': "3.png" },
{ 'day_id': 3, 'day_name': 'Wednsday', 'image': "1.png" },
{ 'day_id': 3, 'day_name': 'Wednsday', 'image': "2.png" }
];
var grouped = [];
stepsModel.forEach(function(a) {
if (!this[a.day_id]) {
this[a.day_id] = { day_id: a.day_id, day_name: a.day_name, special: [] };
grouped.push(this[a.day_id]);
}
this[a.day_id].special.push({ image: a.image });
}, Object.create(null));
console.log(grouped);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)
你可以使用reduce函数创建一个像字典一样的对象,然后在它的键上调用一个map函数:
var groupedDays = stepsModel.reduce((steps, step) => {
if (!steps[step.day_id])
steps[step.day_id] = ({ day_id: step.day_id, day_name: step.day_name, special: [] })
steps[step.day_id].special.push({image: step.image})
return steps
}, {});
var output = Object.keys(groupedDays).map(k => groupedDays[k])