如何高效实现把数组按照指定的顺序排列

数组如下:

var pageIds = [125,123,124];
var arr = [
    {pageId:123},
    {pageId:124},
    {pageId:125},
    ....
]

把数组arr按照指定的pageIds数组中的pageId值顺序排列

阅读 8.7k
7 个回答

sort方法只能做有一定规律的排序,~如果需要实现题主所说的按给定数字排序,我觉得这样会比较简单:
用filter方法逐个筛选出对应的数字,然后用concat方法连接起来,这两个方法都不会改变原数组,所以需要定义一个变量把结果存起来

代码如下:

    var pageIds = [125, 123, 124];
    var arr = [
        { pageId: 123 },
        { pageId: 124 },
        { pageId: 125 }
    ]
    var result = []
    for (let i = 0; i < pageIds.length; i++) {
        result = result.concat(arr.filter(m => m.pageId === pageIds[i]))
    }
    
    console.log(result)

下面的方法是否跟题主期望一致?

arr.sort((a,b)=>{return pageIds.indexOf(a.pageId)-pageIds.indexOf(b.pageId)})
    var result = [];
    for(var i in pageIds){
        for(var j in arr){
            if(arr[j].pageId==pageIds[i]){
                result.push(arr[j]);
                arr.splice(j,1); //减少下次arr遍历长度
                break;//中断遍历
            }
        }
    }
    
function sort(pageIds, arr) {
  var i = 0,
    j = 0,
    tmp;
  for (i = 0; i < pageIds.length; i++) {
    for (j = i; j < arr.length; j++) {
      if (pageIds[i] == arr[j].pageId) {
        tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
      }
    }
  }
  return arr;
}

基于比较的排序算法,最少的时间复杂度也是N*log(N),题主可以选择用快排等排序算法手动排序

这样,两个循环就可以了。这个方法的前提是,你这个id肯定是唯一的~

var pageIds = [125,123,124];
            var arr = [
                {pageId:123},
                {pageId:124},
                {pageId:125}
            ]
            let obj = {}
            arr.map(x => {
                obj[x.pageId] = x
                return x
            })
            arr = pageIds.map(x => {
                return obj[x]
            })
            console.log('result', arr)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题