How to select the last item for each user from an array?

For example, I have an array like this:

[ 
{  
  "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",
},
] 

I only need the last created item for one user, so I need an array like this:

[ 
{
  "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",
},
] 

How can I do this using underscore or lodash?

+4
source share
3 answers

lodash provides orderByand uniqBy.

user, createdAt . createdAt Date, . , 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);
Hide result
+2

Javascript - 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; }
Hide result
+2

with simple javascript, you can do it like this

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));
Run codeHide result
+1
source

Source: https://habr.com/ru/post/1664739/


All Articles