2016-12-09 5 views
3

Я искал в сети, для некоторых примеров, не нашел достойного, который работает и выполняет простую задачу, в которой я нуждаюсь, может быть, вы можете мне помочь.Объектная группа Javascript по дням, месяцам, годам

У меня есть массив объектов:

[ 
    { 
    "date": "2015-01-01T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": false, 
    "isCompleted": true, 
    "size": 1024 
    }, 
    { 
    "date": "2015-01-02T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": false, 
    "isCompleted": false, 
    "size": 1024 
    }, 
    { 
    "date": "2015-02-01T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": true, 
    "isCompleted": false, 
    "size": 1024 
    }, 
    { 
    "date": "2015-02-02T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": false, 
    "isCompleted": true, 
    "size": 1024 
    }, 
    { 
    "date": "2016-04-01T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": true, 
    "isCompleted": false, 
    "size": 1024 
    }, 
    { 
    "date": "2016-04-02T12:00:00.000Z", 
    "photoUrl": "", 
    "inProgress": false, 
    "isCompleted": true, 
    "size": 1024 
    } 
] 

Я ищу простой прямой вперед решение сгруппировать их в год, затем месяц, потом день следующим образом

результат должен быть чем-то, что я могу перебирать на следующий вид:

[ 
    { 
    "2015": [ 
     { 
     "JAN": [ 
      { 
      "01": { 
       "date": "2015-01-01T12:00:00.000Z", 
       "photoUrl": "", 
       "inProgress": false, 
       "isCompleted": true, 
       "size": 1024 
      }, 
      "02": { 
       "date": "2015-01-01T12:00:00.000Z", 
       "photoUrl": "", 
       "inProgress": false, 
       "isCompleted": true, 
       "size": 1024 
      } 
      } 
     ], 
     "FEB": [ 
      { 
      "01": { 
       "date": "2015-02-01T12:00:00.000Z", 
       "photoUrl": "", 
       "inProgress": false, 
       "isCompleted": true, 
       "size": 1024 
      }, 
      "02": { 
       "date": "2015-02-02T12:00:00.000Z", 
       "photoUrl": "", 
       "inProgress": false, 
       "isCompleted": true, 
       "size": 1024 
      } 
      } 
     ] 
     }, 
    ], 
    "2016": [ 
     { 
     "APR": [ 
      { 
      "02": { 
       "date": "2016-04-02T12:00:00.000Z", 
       "photoUrl": "", 
       "inProgress": false, 
       "isCompleted": true, 
       "size": 1024 
      } 
      } 
     ] 
     } 
    ] 
    } 
] 

Конечная цель состоит в том, чтобы идти по нему в списке, нг-повторе с угловым.

Если у кого-то есть предложение, я уверен, что этот код будет очень полезным для других, потому что нет примера взятия плоского массива дат и преобразования его в объект года, месяца и дня, где угодно по сети ,

Большое спасибо!

+0

Привет, где же этот массив объектов взялось? Если это происходит, например, из базы данных sql, было бы лучше отсортировать ее по течению – grogro

ответ

1

К сожалению, не похоже, чтобы быть способ уменьшить это далее, поскольку каждый уровень имеет различные требования ключ/значение.

var data = [{"date":"2015-01-01T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":true,"size":1024},{"date":"2015-01-02T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":false,"size":1024},{"date":"2015-02-01T12:00:00.000Z","photoUrl":"","inProgress":true,"isCompleted":false,"size":1024},{"date":"2015-02-02T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":true,"size":1024},{"date":"2016-04-01T12:00:00.000Z","photoUrl":"","inProgress":true,"isCompleted":false,"size":1024},{"date":"2016-04-02T12:00:00.000Z","photoUrl":"","inProgress":false,"isCompleted":true,"size":1024 }]; 
 
var months = [,"JAN","FEB","MAR","APR","MAY","JUN","JUL","AUG","SEP","OCT","NOV","DEC"]; 
 
var re = /^(\d{4})-(\d{2})-(\d{2})/; 
 
var results = data.reduce(function(results,value){ 
 
    var date = value.date.match(re); 
 
    var temp = results; 
 
    var key = date[1]; 
 
    if(!temp.hasOwnProperty(key)) temp[key] = {}; 
 
    temp = temp[key]; 
 
    key = months[date[2]|0]; 
 
    if(!temp.hasOwnProperty(key)) temp[key] = {}; 
 
    temp = temp[key]; 
 
    key = date[3]; 
 
    if(!temp.hasOwnProperty(key)) temp[key] = []; 
 
    temp = temp[key]; 
 
    
 
    temp.push(value); 
 
    return results; 
 
},{}); 
 
console.log(results);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Отличный ответ! можете ли вы предложить, как итерации с помощью ng-repeat? –

+0

@LiadLivnat Это звучит как достаточно большая тема для другого вопроса. – Ouroborus

2

Вы можете просто проверить, установлен ли год и если не назначить массив с пустым объектом в нем. Затем перейдите к месяцу и затем назначьте ему элемент.

var data = [{ date: "2015-01-01T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: true, size: 1024 }, { date: "2015-01-02T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: false, size: 1024 }, { date: "2015-02-01T12:00:00.000Z", photoUrl: "", inProgress: true, isCompleted: false, size: 1024 }, { date: "2015-02-02T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: true, size: 1024 }, { date: "2016-04-01T12:00:00.000Z", photoUrl: "", inProgress: true, isCompleted: false, size: 1024 }, { date: "2016-04-02T12:00:00.000Z", photoUrl: "", inProgress: false, isCompleted: true, size: 1024 }], 
 
    grouped = Object.create(null); 
 

 
data.forEach(function (a) { 
 
    var year = a.date.slice(0, 4), 
 
     month = ['JAN', 'FEB', 'MAR', 'APR', 'MAY', 'JUN', 'JUL', 'AUG', 'SEP', 'OCT', 'NOV', 'DEC'][a.date.slice(5, 7) - 1], 
 
     day = a.date.slice(8, 10); 
 

 
    grouped[year] = grouped[year] || [{}]; 
 
    grouped[year][0][month] = grouped[year][0][month] || [{}]; 
 
    grouped[year][0][month][0][day] = a; 
 
}); 
 

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