如果两个对象具有相同的值,我试图将值从一个对象添加到另一个对象。
这就是对象的基本外观:
var comments = [
{
author: '4jdf7s',
message: 'Comment text here',
posted: '2014-12-29 14:30'
},
{
author: '87sd3w',
message: 'Comment text here',
posted: '2014-12-30 12:00'
}
];
var users = [
{
_id: '87sd3w',
username: 'MyUsername'
},
{
_id: '4jdf7s',
username: 'OtherUsername'
}
];
由于author
和_id
相同,我想将users.username
添加到comments.username
,如下所示:
var comments = [
{
author: '4jdf7s',
username: 'OtherUsername',
message: 'Comment text here',
posted: '2014-12-29 14:30'
},
{
author: '87sd3w',
username: 'MyUsername',
message: 'Comment text here',
posted: '2014-12-30 12:00'
}
];
comments
对象已被排序,这也是为什么它不能被扰乱的原因。
这是我目前的代码,但它根本不起作用:
comments.forEach(function(i, index) {
users.forEach(function(e) {
if(e._id == i.author) {
comments[index].username = e.username;
}
});
});
答案 0 :(得分:2)
Array.forEach
的回调将对象作为第一个参数,而不是索引。所以改为:
comments.forEach(function(comment) {
users.forEach(function(user) {
if (user._id === comment.author) {
comment.username = user.username;
}
});
});
还想指出,像这样的嵌套循环对于大量数据集来说是个坏主意;它的复杂度O(N*M)
。此外,一旦找到匹配项,循环就会继续。我建议您先创建用户查找,以便每次查询都是O(1)
,将整个代码转换为O(N)
:
var usersById = {};
users.forEach(function(user) { usersById[user._id] = user; });
comments.forEach(function(comment) {
var user = usersById[comment.author];
if (user) {
comment.username = user.username;
}
});
答案 1 :(得分:1)
你可以预先设定作者以避免内循环。
var cache = users.reduce(function(acc, user){
acc[user._id] = user.name;
return acc;}, {}
);
comments.forEach(function(comment){
comment.username = cache[comment.author];
});