2016-12-03 19 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(); 
})