2015-10-30 67 views
1

我有一個對象的數組數:Lodash得到重複使用對象本身

[ { 
"username": "user1", 
"profile_picture": "TESTjpg", 
"id": "123123", 
"full_name": "User 1" 
}, { 
"username": "user2", 
"profile_picture": "TESTjpg", 
"id": "43679144425", 
"full_name": "User 2" 
}, { 
"username": "user2", 
"profile_picture": "TESTjpg", 
"id": "43679144425", 
"full_name": "User 2" 
} ] 

我想:

[ { 
"username": "user1", 
"profile_picture": "TESTjpg", 
"id": "123123", 
"full_name": "User 1", 
"count": 1 
}, { 
"username": "user2", 
"profile_picture": "TESTjpg", 
"id": "43679144425", 
"full_name": "User 2", 
"count": 2 
} ] 

我用lodash又名強調了這種方法,但失敗了來處理它。

var uniqueComments = _.chain(comments).uniq(function(item) { return item.from.id; }).value(); 
    var resComment = []; 
    _.forEach(uniqueComments, function(unco) { 
     unco.count = _.find(comments, function(comment) { 
      return unco.id === comment.id 
     }).length; 

     resComment.push(unco); 
    }); 

結果應該在resComment

編輯:更新了對象數組。

+0

你不給我們的源數據,否則我可以給你一個更短的解決方案,它看起來有點更好。但是,考慮一下:_(評論).uniq(「item.from.id」)countBy('名稱) –

+0

我已經更新了問題@EngineerDollery – Yagiz

+0

lodash,並強調是兩個不同的文庫,其中lodash涵蓋了大部分的下劃線方法。在相同的簽名,並提供更多更高性能的方式。 lodash不是「也被稱爲」下劃線。 – CKK

回答

1

我會考慮使用_.reduce(),因爲這是你在做什麼 - 減少給定的數組到含有一種不同對象的(潛在的)小數組。

使用_.reduce(),你會做這樣的事情:

var resComment = _.reduce(comments, function(mem, next) { 
    var username = next.username; 
    var existingObj = _.find(mem, function(item) { return item.username === username; }); 
    existingObj ? existingObj.count++ : mem.push(_.extend(next, {count: 1})); 
    return mem; 
}, []); 

這裏是一個JSFiddle

+0

這解決了我的問題,謝謝。 – Yagiz

0

你可以八九不離十使用countBy

var counts = _.countBy(uniqueComments, 'name'); 

我們可以走的更遠,使用_.keys()來遍歷計數對象,並將其轉化成最終的結果集,但你可能可以實現這點使用_keys很容易。

+0

你能給我一個更廣義的解決方案嗎? – Yagiz