使用javascript中的sortBy按值递增哈希值

时间:2015-11-06 17:28:33

标签: javascript sorting hash underscore.js

我在underscore.js库中使用了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函数返回列表,那么是否有另一个好的解决方案来排序哈希或者我需要实现函数返回排序哈希?

3 个答案:

答案 0 :(得分:6)

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 :(得分:2)

此外,如果要按降序返回数组,可以使用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]);
});

答案 2 :(得分:1)

与@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;
}