JavaScript QuickSort Objects - PullRequest
       3

JavaScript QuickSort Objects

1 голос
/ 28 ноября 2011

Предполагая, что у меня есть следующая структура 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"
   }
 ]

1 Ответ

3 голосов
/ 28 ноября 2011

Стандартный 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массив теперь будет иметь последовательность массивов длиной от 1 до n , каждый из которых содержит все объекты с определенным хешем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...