Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript中使用sortBy按值升序排序哈希_Javascript_Sorting_Hash_Underscore.js - Fatal编程技术网

在javascript中使用sortBy按值升序排序哈希

在javascript中使用sortBy按值升序排序哈希,javascript,sorting,hash,underscore.js,Javascript,Sorting,Hash,Underscore.js,我使用了underline.js库中的函数 我有散列,我尝试按值对其进行排序,如下所示: var obj = {x: 2, y: 6, z: 1, q: 4}; _.sortBy(obj) [1, 2, 4, 6] {z: 1, x: 2, q: 4, y: 6} 但输出如下所示: var obj = {x: 2, y: 6, z: 1, q: 4}; _.sortBy(obj) [1, 2, 4, 6] {z: 1, x: 2, q: 4, y: 6} 但我需要对其进行排序,并返回

我使用了underline.js库中的函数

我有散列,我尝试按值对其进行排序,如下所示:

var obj = {x: 2, y: 6, z: 1, q: 4};
_.sortBy(obj)
[1, 2, 4, 6]
{z: 1, x: 2, q: 4, y: 6}
但输出如下所示:

var obj = {x: 2, y: 6, z: 1, q: 4};
_.sortBy(obj)
[1, 2, 4, 6]
{z: 1, x: 2, q: 4, y: 6}
但我需要对其进行排序,并返回具有以下值的键:

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
function return list,所以有没有另一个好的解决方案来排序散列,或者我需要实现函数return sorted hash

JavaScript中没有排序哈希(对象)这样的东西。您可以做的是将键放入一个数组中,迭代该数组,然后使用这些键访问对象属性

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

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

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


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

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

在js中,根据定义,对象属性的顺序是未定义的。如果没有一个数组或任何其他额外的容器来保存正确的顺序,你就不能做你想做的事情。谢谢@Ragnar。在我编辑问题之前,你已经回答了。我想返回升序,但我错误地键入:(如果值不是整数,考虑这个函数:<代码>键。排序(函数ByVar(a,b){if(Obj[a] < Obj[b])返回- 1;如果(Obj[a]>Obj[b])返回1;返回0;})