2011-11-28 63 views
1

假设我有以下的Javascript结构:的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" 
    } 
] 

回答

3

标准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); 
}); 

如果你是只是试图找到或重复散列组ES,不过,你可能希望在键入的散列对象收集:

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 - TO- ň长数组,每个都包含与特定的所有对象哈希值。

+1

我会使用内置'string.stringCompare'或'string.localeCompare'而不是在一对丑陋的三元组中滚动自己。 –

+0

@AaronDufour - 谢谢,不知道那种方法。虽然我认为我的三元组很漂亮:)。 – nrabinowitz

+0

我觉得一个三元组很漂亮,但是嵌套的三元组让我害怕。 –