【问题标题】:Sort an array in javascript based on another array基于另一个数组对javascript中的数组进行排序
【发布时间】:2017-09-12 21:45:42
【问题描述】:

我有一组 Mongoose ID,如下所示:

       var ids =[
        mongoose.Types.ObjectId('58c2871414cd3d209abf4fc1'), 
        mongoose.Types.ObjectId('58c2871414cd3d209abf4fc0'),  
        mongoose.Types.ObjectId('58c2871414cd3d209abf5fc0')
      ];

当我调用 Mongoose 函数来获取与这些 id 匹配的子文档时,这些对象会按照它们在数据库中的查找顺序返回给我。我可以根据上述 'ids' 数组的顺序重新排序吗?

返回给我的数据如下:

 [ { _id: 58c2871414cd3d209abf5fc9,
        companyname: 'Dell',
        position: 
         { _id: 58c2871414cd3d209abf5fc0,
           title: 'Software Engineer',
           location: 'Waterford',
           start: 'May 2017',
           term: 6,
           description: ' Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus quis erat vitae dsit amet, consectetur adipiscing elit. Vivamus quis erat vitae dolor tempus euismod non in mi' },
      { _id: 58ca9fd6588205e9c8f01431,
        companyname: 'Google',
        position: 
         { _id: 58c2871414cd3d209abf4fc0,
           title: 'Software Engineer',
           location: 'Waterford',
           start: 'May 2017',
           term: 6,
           description: ' Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus quis erat vitae dsit amet, consectetur adipiscing elit. Vivamus quis erat vitae dolor tempus euismod non in mi' },

      { _id: 58ca9fd6588205e9c8f01431,
        companyname: 'Google',
        position: 
         { _id: 58c2871414cd3d209abf4fc1,
           title: 'Software Engineer',
           location: 'Waterford',
           start: 'June 2017',
           term: 12,
           description: ' Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus quis erat vitae dsit amet, consectetur adipiscing elit. Vivamus quis erat vitae dolor tempus euismod non in mi' },
 ]

有没有办法根据原始数组重新排序?请注意,数组中返回了两个 _id,它是我需要订购的位置子文档的 id。如果有人可以提供帮助,那就太棒了!

编辑:

我的Node.js函数如下:

    var ids =[mongoose.Types.ObjectId('58c2871414cd3d209abf4fc0'), mongoose.Types.ObjectId('58c2871414cd3d209abf4fc1'), mongoose.Types.ObjectId('58c2871414cd3d209abf5fc0')];
    User.aggregate( { $unwind : "$position" },
    { $match: { "position._id": {
      $in: ids }
    }
    }
    , function(err, results){

   //   results.sort((a, b) => {
           console.log(a+" "+b);
   //     return ids.indexOf(mongoose.Types.ObjectId(a.position._id)) 
 //       - ids.indexOf(mongoose.Types.ObjectId(b.position._id))
 //   })
         res.send({results:results});
    });

    });

登录控制台:

[object Object] [object Object]
[object Object] [object Object]

【问题讨论】:

    标签: arrays node.js mongoose


    【解决方案1】:

    您可以将Array.prototype.sort() 与比较函数一起使用,比较函数使用Array.prototype.indexOf() 查找ids 中每个元素的索引并给出element.postion.id

    代码如下:

    data.sort((a, b) => {
        return ids.indexOf(a.position._id) - ids.indexOf(b.position._id)
    })
    

    我用_id作为字符串,你要改成mongoose.Types.ObjectId()

    我觉得是这样的

    data.sort((a, b) => {
        return ids.indexOf(mongoose.Types.ObjectId(a.position._id)) - ids.indexOf(mongoose.Types.ObjectId(b.position._id))
    })
    

    【讨论】:

    • 感谢您的帮助!不过,我对如何将其合并到我的代码中有些困惑,我已经更新了我的问题以显示我的 Node.js 发布请求以获取数据。如果我做错了,你知道吗?现在,如果我将它留在注释的位置,则返回相同的数组。再次感谢!
    • 你的意思是排序函数没有被注释时的代码返回相同的数组?
    • 是的,这很奇怪。我不确定是不是我把它放错了地方还是什么? @Khaled Hamed
    • 尝试在发送前添加console.log(results),在排序函数中也添加console.log(a+" "+b)以知道错误在哪里。始终通过console.log()-ing 到处测试。
    • 添加 console.log(results) 按预期返回信息(从数据库返回的顺序)但是当我尝试记录任何引用 a 或 b 的内容时..我目前有控制台。 log(a+" "+b) 在 return 语句及其空白下方。还尝试单独记录 a 并且还为空白?这很奇怪
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    相关资源
    最近更新 更多