2017-10-03 9 views
1

배열로 그룹화하거나 월별로 배열을 다시 구성한 다음 중첩 된 일을 그룹화하는 우아한 방법을 찾고 있습니다.배열을 월 및 일로

예에서 :

[ 
    { 
    "_id": "59d34fabe0a967636c7642f2", 
    "date": "2017-02-12", 
    "isActive": true 
    }, 
    { 
    "_id": "59d34fab9d1a05ca06ef9775", 
    "date": "2017-02-12", 
    "isActive": true 
    }, 
    { 
    "_id": "59d34fab4d49dc45357ab3a5", 
    "date": "2017-02-16", 
    "isActive": true 
    }, 
    { 
    "_id": "59d34fab5aa903089e1f9a44", 
    "date": "2017-03-21", 
    "isActive": true 
    } 
] 

예에 : 우아한 방법으로 그룹의 일을 얻을하는 방법을 잘 나는 첫 번째 부분을 가지고 있지만 : 처음에는

{ 
    '2017-02': [ 
    { 
     "day": "2017-02-12", 
     "content": [ 
     { 
      "_id": "59d34fabe0a967636c7642f2", 
      "date": "2017-02-12", 
      "isActive": true 
     }, 
     { 
      "_id": "59d34fab9d1a05ca06ef9775", 
      "date": "2017-02-12", 
      "isActive": true 
     } 
    }, 
    { 
     "day": "2017-02-16", 
     "content": [ 
     { 
      "_id": "59d34fabe0a967636c7642f2", 
      "date": "2017-02-16", 
      "isActive": true 
     } 
    }, 
    ], 
    '2017-03': [ 
    { 
     "day": "2017-03-21", 
     "content": [ 
     { 
      "_id": "59d34fabe0a967636c7642f2", 
      "date": "2017-03-21", 
      "isActive": true 
     } 
    }, 
} 

, 나는 GROUPBY 사용 :

groupBy(array, (item) => { 
    return item.date.substring(0,7); 
}; 

그룹 일은 어떻게됩니까? 미리 감사드립니다.

답변

3

월 및 일별로 그룹화하기 위해 중첩 해시 테이블을 사용할 수 있습니다.

var data = [{ _id: "59d34fabe0a967636c7642f2", date: "2017-02-12", isActive: true }, { _id: "59d34fab9d1a05ca06ef9775", date: "2017-02-12", isActive: true }, { _id: "59d34fab4d49dc45357ab3a5", date: "2017-02-16", isActive: true }, { _id: "59d34fab5aa903089e1f9a44", date: "2017-03-21", isActive: true }], 
 
    result = {}, 
 
    hash = Object.create(null); 
 

 
data.forEach(function (o) { 
 
    var month = o.date.slice(0, 7), 
 
     day = o.date.slice(-2); 
 

 
    if (!hash[month]) { 
 
     hash[month] = { _: [] }; 
 
     result[month] = hash[month]._; 
 
    } 
 
    if (!hash[month][day]) { 
 
     hash[month][day] = []; 
 
     result[month].push({ day: o.date, content: hash[month][day] }); 
 
    } 
 
    hash[month][day].push(o); 
 
}); 
 

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

1

당신은 update, forEachgroupBy 방법으로이 방법을 수행 할 수 있습니다

var arr=[ 
 
    { 
 
    "_id": "59d34fabe0a967636c7642f2", 
 
    "date": "2017-02-12", 
 
    "isActive": true 
 
    }, 
 
    { 
 
    "_id": "59d34fab9d1a05ca06ef9775", 
 
    "date": "2017-02-12", 
 
    "isActive": true 
 
    }, 
 
    { 
 
    "_id": "59d34fab4d49dc45357ab3a5", 
 
    "date": "2017-02-16", 
 
    "isActive": true 
 
    }, 
 
    { 
 
    "_id": "59d34fab5aa903089e1f9a44", 
 
    "date": "2017-03-21", 
 
    "isActive": true 
 
    } 
 
] 
 

 
var groupResult = _.groupBy(arr, item => { 
 
\t return item.date.split('-').splice(0,2).join('-') 
 
}); 
 

 
_.forEach(
 
    groupResult, 
 
    (dates, key) => _.update(
 
    groupResult, 
 
    key, 
 
    datesArray => _.groupBy(datesArray, item => item.date) 
 
) 
 
); 
 

 
console.log('groupResult ==> ', groupResult);
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>