【问题标题】:Comparing two arrays of objects and updating lastSeen based on id in Javascript比较两个对象数组并根据 Javascript 中的 id 更新 lastSeen
【发布时间】:2018-06-05 00:13:02
【问题描述】:

我有两个包含 _id 和 lastSeen 的用户对象数组。

allUsersSeen = [
   {_id: '12csdf', lastSeen: 212512},
   {_id: '232csdf', lastSeen: 34345},
   {_id: '1253csdf', lastSeen: 6346453},
   {_id: '772csfddf', lastSeen: 2345345}
]

currentUsersSeen = [
   {_id: '12csdf', lastSeen: Date.now()},
   {_id: '1253csdf', lastSeen: Date.now()},
   {_id: '1fsdf', lastSeen: Date.now()}
]

我想比较这两个数组,如果 allUsersSeen _id 与 currentUsersSeen 匹配,我想将 lastSeen 更新为 Date.now()。所有其他 _id 将保持其 lastSeen 为原来的状态。

应将 currentUsersSeen 中的任何剩余 _id 推送到 allUsersSeen 并使用 Date.now() 的 lastSeen

allUsersSeen 的最终数组应如下所示:

allUsersSeen = [
   {_id: '12csdf', lastSeen: Date.now()},
   {_id: '232csdf', lastSeen: 34345},
   {_id: '1253csdf', lastSeen: Date.now()},
   {_id: '772csfddf', lastSeen: 2345345},
   {_id: '1fsdf', lastSeen: Date.now()}
]

显然 Date.now() 将是当前日期/时间。 我该怎么做呢? 我尝试过使用嵌套的 for 循环并尝试使用 forEach() 和 map()。

任何帮助将不胜感激。 谢谢。

【问题讨论】:

  • 你应该发布你尝试过的以及它是如何不工作的

标签: javascript arrays node.js mongodb object


【解决方案1】:

你可能想要这样的东西

allUsersSeen = [
   {_id: '12csdf', lastSeen: 212512},
   {_id: '232csdf', lastSeen: 34345},
   {_id: '1253csdf', lastSeen: 6346453},
   {_id: '772csfddf', lastSeen: 2345345}
]

currentUsersSeen = [
   {_id: '12csdf', lastSeen: Date.now()},
   {_id: '1253csdf', lastSeen: Date.now()},
   {_id: '1fsdf', lastSeen: Date.now()}
]

let newArr = allUsersSeen.map(user => currentUsersSeen.find(curr_user => curr_user._id === user._id) || user);

【讨论】:

    【解决方案2】:

    您可以array#concat 两个数组,然后使用array#reduce 更新lastSeen

    var allUsersSeen = [{_id: '12csdf', lastSeen: 212512},{_id: '232csdf', lastSeen: 34345},{_id: '1253csdf', lastSeen: 6346453},{_id: '772csfddf', lastSeen: 2345345}],
        currentUsersSeen = [{_id: '12csdf', lastSeen: Date.now()},{_id: '1253csdf', lastSeen: Date.now()},{_id: '1fsdf', lastSeen: Date.now()}],
        
        result = Object.values( allUsersSeen.concat(currentUsersSeen).reduce((r, {_id, lastSeen}) => {
          r[_id] = r[_id] ? {...r[_id], lastSeen} : {_id, lastSeen};
          return r;
        },{}));
    
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      这样试试,

      allUsersSeen = [
              {_id: '12csdf', lastSeen: 212512},
              {_id: '232csdf', lastSeen: 34345},
              {_id: '1253csdf', lastSeen: 6346453},
              {_id: '772csfddf', lastSeen: 2345345}
          ];
      
          currentUsersSeen = [
              {_id: '12csdf', lastSeen: Date.now()},
              {_id: '1253csdf', lastSeen: Date.now()},
              {_id: '1fsdf', lastSeen: Date.now()}
          ];
      
          function merge(a, b, prop){
              var reduced =  a.filter( a_item => ! b.find ( b_item => a_item[prop] === b_item[prop]) )
              return reduced.concat(b);
          }
          console.log( merge(allUsersSeen, currentUsersSeen, "_id") );

      【讨论】:

      • 是的,这是完美的。谢谢!
      【解决方案4】:

      如果您了解您想要做什么,您可以通过首先从 allUsersSeen(如果存在)中删除元素,然后从 currentUser 中再次添加它来实现。

      allUsersSeen = [
         {_id: '12csdf', lastSeen: 212512},
         {_id: '232csdf', lastSeen: 34345},
         {_id: '1253csdf', lastSeen: 6346453},
         {_id: '772csfddf', lastSeen: 2345345}
      ]
      
      currentUsersSeen = [
         {_id: '12csdf', lastSeen: Date.now()},
         {_id: '1253csdf', lastSeen: Date.now()},
         {_id: '1fsdf', lastSeen: Date.now()}
      ]
      
      currentUsersSeen.forEach(user => {
        allUsersSeen = allUsersSeen.filter( obj => obj._id != user.id )
        allUsersSeen.push(user)
      })

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-04
        • 1970-01-01
        • 2017-06-01
        相关资源
        最近更新 更多