2016-09-28 104 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])