2016-12-03 48 views
1

我能做到更好LoDash?我想檢查第一個對象id是否與第二個對象相等,如果是的話,它應該添加一些東西到第二個對象。在這裏我目前的解決方案:與瑤池客戶LoDash檢查對象一和二值相等,如果這樣比較

vm.forumUsers.forEach(function(user, forumIndex){ 
    vm.teamspeakClients.forEach(function(client, clientIndex){ 
    if (user.tsid === client.client_unique_identifier) { 
     vm.forumUsers[forumIndex]['tsdbid']   = client.cldbid; 
     vm.forumUsers[forumIndex]['tsnickname']  = client.client_nickname; 
     vm.forumUsers[forumIndex]['tslastconnected'] = client.client_lastconnected; 
    } 
    }); 
}); 

vm.usersCollection = vm.forumUsers; 
+0

背後有什麼選擇Lodash此任務的原因何在呢?它已經在項目中使用了嗎?因爲通常filter-map-reduce對此非常好。 – estus

+0

是的,我有LoDash工作現在改變了一些事情吧,讓所有有點更加清晰。 你對filter-map-reduce有什麼意思? @estus – muuvmuuv

+0

已經有一些內置ES5(過濾的map-reduce)和polyfilled ES6陣列功能,允許做的工作更多的慣用方式。有些東西(如Lodash'pick')仍然是非常方便的,但在這種特殊情況下Lodash不能提供多少,除了額外的足跡。 – estus

回答

1

JS已經提供了很多的下劃線/ Lodash的目的是爲東西慣用的方式。

對於ES5也可能是

vm.forumUsers.forEach(function(user) { 
    var client = vm.teamspeakClients 
    .filter(function (client) { return user.tsid === client.client_unique_identifier }) 
    .map(function (client) { return { 
    tsdbid: client.cldbid, 
    tsnickname : client.client_nickname, 
    tslastconnected: client.client_lastconnected 
    })[0]; 

    Object.assign(user, client); 
}); 

它變得更整潔了ES6。

如果性能的情況下(這可能是UI代碼與大量數據的問題)原料for環永遠是最好的選擇。

1

合併用戶特殊鍵

var res = _.map(vm.forumUsers, function(user) { 
    return _.chain(vm.teamspeakClients) 
     .find({client_unique_identifier: user.tsid}) // find client 
     .defaultTo({}) // set {} if client not found 
     .thru(function(client) { // convert props, use _.pick to set same clients keys 
      return { 
        tsdbid: client.cldbid, 
        tsnickname: client.client_nickname, 
        tslastconnected: client.client_lastconnected 
      }; 
     }) 
     .merge(user) 
     .value(); 
})