Javascript LoDash检查对象1和对象2的值是否相等,如果是,请进行比较

Javascript LoDash检查对象1和对象2的值是否相等,如果是,请进行比较,javascript,angularjs,lodash,Javascript,Angularjs,Lodash,我可以用LoDash做得更好吗?我想检查第一个对象id是否与第二个对象id相等,如果相等,它应该从第二个对象向第一个对象添加一些内容。以下是我当前的解决方案: vm.forumUsers.forEach(function(user, forumIndex){ vm.teamspeakClients.forEach(function(client, clientIndex){ if (user.tsid === client.client_unique_identifier) {

我可以用LoDash做得更好吗?我想检查第一个对象id是否与第二个对象id相等,如果相等,它应该从第二个对象向第一个对象添加一些内容。以下是我当前的解决方案:

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;

将用户与查找到的客户端特殊密钥合并

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();
})

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
循环始终是最佳选择。

为该任务选择Lodash的原因是什么?它已经在项目中使用了吗?因为通常情况下,过滤贴图还原就足够了。是的,我现在正在使用LoDash,并用它更改了一些内容,使所有内容更加清晰。你说的过滤器映射减少是什么意思@EST已经有许多内置ES5(filter map reduce)和多填充ES6数组函数,它们允许以更惯用的方式完成这项工作。有些东西(如Lodash
pick
)仍然非常方便,但在这种特殊情况下,Lodash除了额外的占地面积外,不能提供太多。请您提供一个示例,说明如何做到这一点,或者哪一个是适合大约500名用户的最佳解决方案@estusIt实际上取决于这段代码运行的频率。如果它在每个摘要上都会触发,并且可能会导致性能问题,那么对于冗长的循环(500是一个相当大的数字),我建议将
forEach
替换为良好的旧
for(var I=0…
),不要再看了。