【问题标题】:JavaScript QuickSort ObjectsJavaScript 快速排序对象
【发布时间】:2012-01-07 16:14:54
【问题描述】:

假设我有以下 Javascript 结构:

[
  {
    "hash": "fe5642d26d04cc7e7d47daa426da2a79e244bdcbae1594a12578f0d6fe03082e",
    "path": "/Users/justin/test/node-w.tar.gz"
  },
  {
    "hash": "b1adffc1988b7339c7d4c59310fb3a64ce89e776a4924d492e819a08a7dce3fd",
    "path": "/Users/justin/test/level-1/level-1-1/music.mp3"
  },
  {
    "hash": "fe5642d26d04cc7e7d47daa426da2a79e244bdcbae1594a12578f0d6fe03082e",
    "path": "/Users/justin/test/level-1/level-1-1/node-z.tar.gz"
  },
  {
    "hash": "2e456c8de66a4ab6cf929d52bd6928b2d0096a8116891ade3dde9588c5f6b3c2",
    "path": "/Users/justin/test/logo_large.psd"
  },
  {
    "hash": "fe5642d26d04cc7e7d47daa426da2a79e244bdcbae1594a12578f0d6fe03082e",
    "path": "/Users/justin/test/level-1/node-y.tar.gz"
  },
  {
    "hash": "fce57d4407e847c4c13cb2867d3f00f2aed4b5c569385d04765abe2fcae726bb",
    "path": "/Users/justin/test/level-1/install.dmg"
  }
]

这只是一个基本的例子,实际上,它会有数千甚至数万个对象长。我想在hash 上对重复项进行分组,所以基本上以最快的方式按哈希排序,所以快速排序。结果应该如下所示:

[
  {
    "hash": "2e456c8de66a4ab6cf929d52bd6928b2d0096a8116891ade3dde9588c5f6b3c2",
    "path": "/Users/justin/test/logo_large.psd"
  },
  {
    "hash": "b1adffc1988b7339c7d4c59310fb3a64ce89e776a4924d492e819a08a7dce3fd",
    "path": "/Users/justin/test/level-1/level-1-1/music.mp3"
  },
  {
    "hash": "fce57d4407e847c4c13cb2867d3f00f2aed4b5c569385d04765abe2fcae726bb",
    "path": "/Users/justin/test/level-1/install.dmg"
  }, 
  {
     "hash": "fe5642d26d04cc7e7d47daa426da2a79e244bdcbae1594a12578f0d6fe03082e",
     "path": "/Users/justin/test/node-w.tar.gz"
   },
   {
     "hash": "fe5642d26d04cc7e7d47daa426da2a79e244bdcbae1594a12578f0d6fe03082e",
     "path": "/Users/justin/test/level-1/level-1-1/node-z.tar.gz"
   },
   {
     "hash": "fe5642d26d04cc7e7d47daa426da2a79e244bdcbae1594a12578f0d6fe03082e",
     "path": "/Users/justin/test/level-1/node-y.tar.gz"
   }
 ]

【问题讨论】:

    标签: javascript sorting object quicksort


    【解决方案1】:

    标准的 Javascript Array.sort() 非常快:

    myArray.sort(function(a,b) { 
        return a.hash == b.hash ? 0 : 
            a.hash > b.hash ? 1 : -1; 
    });
    

    编辑:正如@Aaron 所说,.localeCompare 更简洁:

    myArray.sort(function(a,b) { 
        return a.hash.localeCompare(b.hash);
    });
    

    如果您只是试图通过重复的哈希查找或分组,那么您可能希望收集一个与哈希键相关的对象:

    var hashes = {},
        groups = [],
        i, hash;
    for (i=0; i < myArray.length; i++) {
        hash = myArray[i].hash;
        if (hash in hashes) {
            hashes[hash].push(myArray[i]);
        } else {
            hashes[hash] = [myArray[i]];
        }
    }
    // now turn into an array
    for (hash in hashes) {
        if (hashes.hasOwnProperty(hash)) {
            groups.push(hashes[hash]);
        }
    }
    

    groups 数组现在将有一系列长度为 n 的数组,每个数组都包含具有特定哈希的所有对象。

    【讨论】:

    • 我会使用内置的string.stringComparestring.localeCompare,而不是在丑陋的三元组中滚动你自己的。
    • @AaronDufour - 谢谢,不知道那种方法。虽然我认为我的三元组很漂亮:)。
    • 我认为单个三元组很漂亮,但是没有括号的嵌套三元组让我害怕。
    猜你喜欢
    • 2011-07-08
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 2021-10-01
    • 1970-01-01
    • 2022-10-31
    相关资源
    最近更新 更多