Javascript LoDash检查对象1和对象2的值是否相等,如果是,请进行比较
我可以用LoDash做得更好吗?我想检查第一个对象id是否与第二个对象id相等,如果相等,它应该从第二个对象向第一个对象添加一些内容。以下是我当前的解决方案: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) {
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数组函数,它们允许以更惯用的方式完成这项工作。有些东西(如Lodashpick
)仍然非常方便,但在这种特殊情况下,Lodash除了额外的占地面积外,不能提供太多。请您提供一个示例,说明如何做到这一点,或者哪一个是适合大约500名用户的最佳解决方案@estusIt实际上取决于这段代码运行的频率。如果它在每个摘要上都会触发,并且可能会导致性能问题,那么对于冗长的循环(500是一个相当大的数字),我建议将forEach
替换为良好的旧for(var I=0…
),不要再看了。