2015-11-06 49 views
4

我在underscore.js庫中使用了sortBy函數。在javascript中使用sortBy對哈希值進行排序

我有亂碼,我試着值以下對它進行排序:

var obj = {x: 2, y: 6, z: 1, q: 4}; 
_.sortBy(obj) 

但輸出爲以下幾點:

[1, 2, 4, 6] 

但我需要對它進行排序,並與值返回鍵,如下所示:

{z: 1, x: 2, q: 4, y: 6} 

我怎樣才能返回使用sortBy排序的散列?

我注意到sortBy函數返回列表,所以還有另一個很好的解決方案來排序哈希或我需要實現函數返回排序哈希?

+1

在JS,對象屬性的順序是根據定義不明確的。如果沒有數組或任何其他額外的*容器*來保持正確的順序,你就無法做到你想要的。 – Yoshi

回答

0

涉及@Ragnar的答案。我有解決方案來解決這個問題。並返回排序的哈希。

升階

function getSortedHash(inputHash){ 
    var resultHash = {}; 

    var keys = Object.keys(inputHash); 
    keys.sort(function(a, b) { 
    return inputHash[a] - inputHash[b] 
    }).forEach(function(k) { 
    resultHash[k] = inputHash[k]; 
    }); 
    return resultHash; 
} 

降序

function getSortedHash(inputHash){ 
    var resultHash = {}; 

    var keys = Object.keys(inputHash); 
    keys.sort(function(a, b) { 
    return inputHash[a] - inputHash[b] 
    }).reverse().forEach(function(k) { 
    resultHash[k] = inputHash[k]; 
    }); 
    return resultHash; 
} 
4

JavaScript中沒有這樣的事物作爲排序哈希(對象)。你可以做的就是把鍵放在數組中,迭代並使用鍵來訪問對象屬性。

var keys = Object.keys(obj); 
keys.sort(function(a, b) { 
    return obj[a] - obj[b] 
}); 

keys.forEach(function(k) { 
    console.log(obj[k]); 
}); 
1

另外,如果你想按降序返回數組,你可以使用reverse()功能:

var obj = {x: 2, y: 6, z: 1, q: 4}; 

var keys = Object.keys(obj); 
keys.sort(function(a, b) { 
    return obj[a] - obj[b] 
}).reverse().forEach(function(k) { 
    console.log(obj[k]); 
}); 

或者只是像這樣(感謝@muistooshort):

var obj = {x: 2, y: 6, z: 1, q: 4}; 

var keys = Object.keys(obj); 
keys.sort(function(a, b) { 
    return obj[b] - obj[a] //inverted comparison 
}).forEach(function(k) { 
    console.log(obj[k]); 
}); 
+0

謝謝@Ragnar。在我編輯問題之前,你回答了。我想返回升序但是我錯誤地輸入了:( –

相關問題