【问题标题】:Sort hash ascending by value using sortBy in javascript在javascript中使用sortBy按值升序对哈希进行排序
【发布时间】:2016-02-07 22:16:18
【问题描述】:

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

【问题讨论】:

  • 在js中,对象属性的顺序是未定义的。如果没有数组或任何其他额外的容器来保持正确的顺序,你就无法做你想做的事。

标签: javascript sorting hash underscore.js


【解决方案1】:

在 JavaScript 中没有排序哈希(对象)之类的东西。您可以做的是将键放入数组中,对其进行迭代并使用键来访问对象属性。

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

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

【讨论】:

  • 如果值不是整数,考虑这个排序函数:keys.sort(function byVal(a,b){ if (obj[a] < obj[b]) return -1; if ( obj[a] > obj[b]) return 1; return 0; })
【解决方案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]);
});

【讨论】:

  • 谢谢@Ragnar。在我编辑问题之前你已经回答了。我想返回升序但我输入错误:(
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2011-06-08
    相关资源
    最近更新 更多