从其他数组对象

时间:2015-04-23 20:38:30

标签: javascript arrays node.js

我有2个数组array1,array2。

  1. 数组1对象:userName,userId
  2. 数组2对象:userId,msg
  3. 我想获得array3:userId,userName,msg
  4. 数组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' } ]
    

3 个答案:

答案 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)
})

JSFiddle Functional

说明:

两个对象数组,一个是用户列表,另一个是其中一些用户的消息列表。

您想要充实显示显示用户名的消息的报告,因此请从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)
}

JSFiddle Loopy

或者,使用函数式编程概念,首先map将函数添加到messages数组中的每个项目。该函数使用users数组和filter来查找当前消息的相应用户对象,并在该结果上map将当前消息信息与过滤后的用户结果相结合。此时,您有一个包装在数组中的对象,因为mapfilter方法返回数组。因此,最后的操作是使用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

更多关于Functional Programming in JavaScript