2016-12-24 3 views
4

예를 들어,이 같은 배열이 있습니다배열에서 사용자 당 최신 항목을 선택하는 방법은 무엇입니까?

[ 
{ 
    "data": "some data", 
    "user": "A", 
    "createdAt":"2016-12-24", 
}, 
{ 
    "data": "some data2", 
    "user": "B", 
    "createdAt":"2016-12-24", 
}, 
{ 
    "data": "some data3", 
    "user": "A", 
    "createdAt":"2016-12-25", 
}, 
{ 
    "data": "some data4", 
    "user": "A", 
    "createdAt":"2016-12-23", 
}, 
{ 
    "data": "some data5", 
    "user": "B", 
    "createdAt":"2016-12-25", 
}, 
{ 
    "data": "some data6", 
    "user": "C", 
    "createdAt":"2016-12-24", 
}, 
] 

나는 단 한 사용자 당 최신 만든 항목을 필요하므로이 같은 배열이 필요합니다

[ 
{ 
    "data": "some data3", 
    "user": "A", 
    "createdAt":"2016-12-25", 
}, 
{ 
    "data": "some data5", 
    "user": "B", 
    "createdAt":"2016-12-25", 
}, 
{ 
    "data": "some data6", 
    "user": "C", 
    "createdAt":"2016-12-24", 
}, 
] 

내가 어떻게 할 수 밑줄이나 로다시가 있니?

답변

2

lodash는 orderByuniqBy 방법을 제공합니다.

열쇠는 user 다음으로 내림차순으로 createdAt으로 주문하십시오. createdAtDate이므로이를 그대로 취급해야합니다. Conveiniently orderBy 메서드를 사용하면 주문할 속성이나 평가할 함수 (이 경우는 Date)를 지정할 수 있습니다.

var data = [{ 
 
     "data": "some data", 
 
     "user": "A", 
 
     "createdAt": "2016-12-24", 
 
    }, { 
 
     "data": "some data2", 
 
     "user": "B", 
 
     "createdAt": "2016-12-24", 
 
    }, { 
 
     "data": "some data3", 
 
     "user": "A", 
 
     "createdAt": "2016-12-25", 
 
    }, { 
 
     "data": "some data4", 
 
     "user": "A", 
 
     "createdAt": "2016-12-23", 
 
    }, { 
 
     "data": "some data5", 
 
     "user": "B", 
 
     "createdAt": "2016-12-25", 
 
    }, { 
 
     "data": "some data6", 
 
     "user": "C", 
 
     "createdAt": "2016-12-24", 
 
    }], 
 
    sorted = _.orderBy(
 
     data, 
 
     ['user', function(d) { 
 
     return new Date(d.createdAt) 
 
     }], 
 
     ['asc', 'desc'] // 'desc' orders by date descending 
 
    ), 
 
    uniqued = _.uniqBy(sorted, 'user'); 
 

 
console.log(uniqued);
일반 자바 스크립트와

1

, 당신은 해시 테이블과 일반 자바 스크립트에서이

var myArray = [ 
 
    { 
 
      "data": "some data", 
 
      "user": "A", 
 
      "createdAt":"2016-12-24", 
 
    }, 
 
    { 
 
      "data": "some data2", 
 
      "user": "B", 
 
      "createdAt":"2016-12-24", 
 
    }, 
 
    { 
 
      "data": "some data3", 
 
      "user": "A", 
 
      "createdAt":"2016-12-25", 
 
    }, 
 
    { 
 
      "data": "some data4", 
 
      "user": "A", 
 
      "createdAt":"2016-12-23", 
 
    }, 
 
    { 
 
      "data": "some data5", 
 
      "user": "B", 
 
      "createdAt":"2016-12-25", 
 
    }, 
 
    { 
 
      "data": "some data6", 
 
      "user": "C", 
 
      "createdAt":"2016-12-24", 
 
    }, 
 
] 
 

 

 

 
function getLatestItems(itemArray) { 
 
    var latestItemPerUser = {}, latesItems = [], newDate, oldDate; 
 

 
    for(var i = 0, l = itemArray.length; i < l; ++i) { 
 
     if(!latestItemPerUser[itemArray[i].user]) { 
 
      latestItemPerUser[itemArray[i].user] = itemArray[i]; 
 
     } else { 
 
      newDate = new Date(itemArray[i].createdAt); 
 
      oldDate = new Date(latestItemPerUser[itemArray[i].user].createdAt); 
 

 
      if(oldDate < newDate) { 
 
       latestItemPerUser[itemArray[i].user] = itemArray[i]; 
 
      } 
 
     } 
 
    } 
 

 
    for(var item in latestItemPerUser) { 
 
     latesItems.push(latestItemPerUser[item]); 
 
    } 
 

 
    return latesItems; 
 
} 
 

 
console.log(getLatestItems(myArray));

+0

좋은 솔루션입니다. 미래에 여기 올 사람들을 위해 추가 라이브러리없이 그것을 할 수있는 방법을 모색합니다. [prototype extension] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort)의 javascript (대부분의 브라우저에 내장되어 있습니다)의'sort()'메소드는,), 키의 정렬 방법의 속도를 높여 논리적으로 조금 더 빨라질 수 있습니다. –

+0

고마워요, @ SamuelJackson. 두 번째 생각에서 우리는 "createdAt"속성이 항상 "YYYY-MM-DD"형식으로 제공된다고 확신 할 수 있다면 Date 객체를 제거 할 수 있습니다. 또한 ES2015를 사용할 수있는 경우 코드는 –

+0

으로 표시됩니다. function getLatestItemsES6 (itemArray) { latestItems = []; (itemArray.sort ((a, b) => a.createdAt obj.user === item.user)) { latestItems.push (item); } } 반품 latestItems; } ' –

2

또 다른 솔루션과 수표처럼 그것을 할 수 있습니다 나중에 createdAt.

var data = [{ "data": "some data", "user": "A", "createdAt": "2016-12-24", }, { "data": "some data2", "user": "B", "createdAt": "2016-12-24", }, { "data": "some data3", "user": "A", "createdAt": "2016-12-25", }, { "data": "some data4", "user": "A", "createdAt": "2016-12-23", }, { "data": "some data5", "user": "B", "createdAt": "2016-12-25", }, { "data": "some data6", "user": "C", "createdAt": "2016-12-24", }], 
 
    result = data.reduce(function (hash) { 
 
     return function (r, a) { 
 
      if (!(a.user in hash)) { 
 
       hash[a.user] = r.push(a) - 1; 
 
       return r; 
 
      } 
 
      if (r[hash[a.user]].createdAt < a.createdAt) { 
 
       r[hash[a.user]] = a; 
 
      } 
 
      return r; 
 
     }; 
 
    }(Object.create(null)), []); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
순수 자바 스크립트에 대한

+0

코드를 처음 접했을 때 나는 완전히 그 코드를 잘 이해하지 못하고 깨끗한 코드입니다. 내가 볼 수 있듯이 스크립트 수준에는 실제 루프가 없습니다. LINQ와 비슷하지만 JavaScript에서와 비슷합니까? 모든 데이터는'reduce'를 통해 메소드에 푸시되고 메소드는 재귀 적으로 작동합니까? –

+0

@SamuelJackson, 기본적으로 그것은'data'의 모든 요소에 대해 호출되는 콜백과'hash '에 대한 클로저를 사용합니다.이 콜백은 콜백에서'a'로 표현됩니다. 결과는'r'에 수집되어 모든 루프마다 리턴됩니다. 콜백은 모든 항목에 대해 호출되지만 자체를 호출하지 않으므로 재귀 호출은 아닙니다. –

+0

아주 섹시한 자바 스크립트 조각. 정보 주셔서 감사합니다.재귀를 통해 배열의 각 항목에 대해 해당 메서드에 데이터를 전달하고 결과를 반환한다는 것을 의미했습니다. 이런 방식으로 .NET의 LINQ와 유사합니다. 나는 그것을 <3 사랑한다. –