我有2个数组array1,array2。
数组1:
[{ userName: 'vimal', userId: 789 },
{ userName: 'kabilan', userId: 456 },
{ userName: 'yathavan', userId: 123 }]
ARRAY2:
[ { userId: '123', msg: 'hi' },
{ userId: '789', msg: 'yth' },
{ userId: '789', msg: 'hu' } ]
我想比较2个数组并获得这样的输出。 的 ARRAY3:
[ { userId: '123', userName: 'yathavan', msg: 'hi' },
{ userId: '789', userName: 'vimal', msg: 'yth' },
{ userId: '789', userName: 'vimal', msg: 'hu' } ]
答案 0 :(得分:1)
我将用户数组编入索引包含用户名的用户标识;
var users = [];
for(var i=0; i<arr1.length; i++)
users[arr1[i].userId] = arr1[i].userName;
现在制作你的输出数组,并通过第二个数组。使用users数组插入;
var arr3 = [];
for(var i=0; i<arr2.length; i++)
arr3.push({userId:arr2[i].userId, userName:users[arr2[i].userId], msg:arr2[i].msg});
答案 1 :(得分:1)
如果<NameOfList>
<Listitem>
<ListItemAttributeOne/>
<ListItemAttributeTwo/>
</ListItem>
<ListItem>
<ListItemAttributeOne/>
<ListItemAttributeTwo/>
</ListItem>
<...more ListItems>
</NameOfList>
值不是ary2中的字符串,你会做这样的事情:
userId
答案 2 :(得分:1)
一种现成的“功能性编程”方法:
var users = [{ userName: 'vimal', userId: 789 },
{ userName: 'kabilan', userId: 456 },
{ userName: 'yathavan', userId: 123 }]
var messages = [ { userId: '123', msg: 'hi' },
{ userId: '789', msg: 'yth' },
{ userId: '789', msg: 'hu' } ]
var user_message_list = [];
messages.map(function (message) {
return users.
filter(function (user) {
return user.userId == message.userId
}).
map(function (user) {
return {
"userId": user.userId,
"userName": user.userName,
"msg": message.msg
}
})
})
.forEach(function (item) { // eliminate nested layers
user_message_list.push.apply(user_message_list, item)
})
说明:
两个对象数组,一个是用户列表,另一个是其中一些用户的消息列表。
您想要充实显示显示用户名的消息的报告,因此请从messages
数组开始并循环遍历它。现在,对于通过users
列表的每个消息循环并检索相应的用户名。
“循环”方法是这样的:
var messages_users = []
var message_user = {}
for (ii=0; ii < messages.length; ii++) {
message_user = {
"userId": messages[ii].userId,
"msg": messages[ii].msg
}
for (iii=0; iii < users.length; iii++) {
if ( messages[ii].userId == users[iii].userId ) {
message_user.userName = users[iii].userName
}
}
messages_users.push(message_user)
}
或者,使用函数式编程概念,首先map
将函数添加到messages
数组中的每个项目。该函数使用users
数组和filter
来查找当前消息的相应用户对象,并在该结果上map
将当前消息信息与过滤后的用户结果相结合。此时,您有一个包装在数组中的对象,因为map
和filter
方法返回数组。因此,最后的操作是使用forEach
方法循环以删除额外的数组层。有些JavaScript库有一个concatAll
或更好的concatMap
方法,它隐藏了额外的循环。在这种情况下,你会有这样的事情:
var user_message_list = messages.
concatMap(function (message) {
return users.
filter(function (user) {
return user.userId == message.userId
}).
map(function (user) {
return {
"userId": user.userId,
"userName": user.userName,
"msg": message.msg
}
})
})
这里的好处是语言术语和程序概念之间的紧密联系。例如:filter(...
与for (i=0; ... if ( arr[i] ===...
。两个构造都根据条件循环和选择项目,因此filter
。