2016-09-28 98 views
2

我需要一个帮助。我需要使用Angular.js/Javascript为一个特定格式的键值对数组进行排序。我正在解释下面的数组。如何使用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 } 
     ] 
    } 
] 

请帮我排序给定的数组,并得到如上的结果。

回答

3

您可以使用散列表将图像正确分配到日期。

可选的,如果您喜欢使用简洁风格,则可以使用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; }

+0

其working.Thanks 。 – subhra

+0

如果我需要采取两个关键值,那么它将如何排序。假设我需要使用'day_id和subcat_id'进行排序。 – subhra

+0

你可以使用一个键,比如'var key = a.day_id +'|' + a.subcat_id;'然后使用'this [key]'而不是'this [a.day_id]'。 –

1

你可以用减少功能它来创建,其作用类似于字典的对象,然后调用它的键像这样的地图功能:

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])