【问题标题】:set array object from other array object从其他数组对象中设置数组对象
【发布时间】:2015-04-23 20:38:30
【问题描述】:

我有 2 个数组 array1,array2。

  1. 数组 1 对象:userName、userId
  2. 数组 2 个对象:userId、msg
  3. 我要获取array3:userId、userName、msg

数组1:

[{ userName: 'vimal', userId: 789 },
    { userName: 'kabilan', userId: 456 },
    { userName: 'yathavan', userId: 123 }]

数组2:

[ { userId: '123', msg: 'hi' },
{ userId: '789', msg: 'yth' },
{ userId: '789', msg: 'hu' } ]

我想比较 2 个数组并得到这样的输出。 数组3:

[ { userId: '123', userName: 'yathavan', msg: 'hi' },
{ userId: '789', userName: 'vimal', msg: 'yth' },
{ userId: '789', userName: 'vimal', msg: 'hu' } ]

【问题讨论】:

标签: javascript arrays node.js


【解决方案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

或者,使用函数式编程概念,从 mapmessages 数组中的每个项目添加一个函数开始。该函数采用users 数组和filters 来查找当前消息的相应用户对象,并在该结果上使用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

【讨论】:

    【解决方案2】:

    我会创建一个用户数组来索引包含用户名的用户 ID;

    var users = [];
    
    for(var i=0; i<arr1.length; i++)
      users[arr1[i].userId] = arr1[i].userName;
    

    现在制作你的输出数组,并通过第二个数组。使用用户数组插入;

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

    【讨论】:

      【解决方案3】:

      如果 userId 值不是 ary2 中的字符串,你会这样做:

      var ary1 =[{userName:'vimal', userId:789}, {userName:'kabilan', userId:456}, {userName:'yathavan', userId:123}];
      var ary2 = [{userId:123, msg:'hi'}, {userId:789, msg:'yth'}, {userId:789, msg:'hu'}];
      function specialMerge(ar1, ar2){
        var r = [];
        for(var i=0,l=ar1.length; i<l; i++){
          var p = ar1[i];
          for(var n=0,c=ar2.length; n<c; n++){
            var m = ar2[n];
            if(p.userId === m.userId){
              r.push({userId:p.userId, userName:p.userName, msg:m.msg});
            }
          }
        }
        return r;
      }
      var resultArrayOfObjects = specialMerge(ary1, ary2);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-21
        • 1970-01-01
        • 2020-12-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-14
        相关资源
        最近更新 更多