2015-11-06 104 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。在我编辑问题之前,你回答了。我想返回升序但是我错误地输入了:( –