如何按 Javascript 中的值对关联数组进行排序?

新手上路,请多包涵

我有关联数组:

 array["sub2"] = 1;
array["sub0"] = -1;
array["sub1"] = 0;
array["sub3"] = 1;
array["sub4"] = 0;

按其值排序(降序)的最优雅方法是什么,结果将是一个数组,其中相应的索引按此顺序排列:

 sub2, sub3, sub1, sub4, sub0

原文由 John Smith 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 433
2 个回答

Javascript 没有您想象的那样的“关联数组”。相反,您只需能够使用类似数组的语法(如您的示例)设置对象属性,以及迭代对象属性的能力。

这样做的结果是无法保证您迭代属性的 _顺序_,因此没有什么比它们更合适的了。相反,您需要将对象属性转换为“真正的”数组(保证顺序)。这是一个代码片段,用于将对象转换为二元组数组(双元素数组),按照您的描述对其进行排序,然后对其进行迭代:

 var tuples = [];

for (var key in obj) tuples.push([key, obj[key]]);

tuples.sort(function(a, b) {
    a = a[1];
    b = b[1];

    return a < b ? -1 : (a > b ? 1 : 0);
});

for (var i = 0; i < tuples.length; i++) {
    var key = tuples[i][0];
    var value = tuples[i][1];

    // do something with key and value
}

您可能会发现将它包装在一个接受回调的函数中更自然:

 function bySortedValue(obj, callback, context) {
  var tuples = [];

  for (var key in obj) tuples.push([key, obj[key]]);

  tuples.sort(function(a, b) {
    return a[1] < b[1] ? 1 : a[1] > b[1] ? -1 : 0
  });

  var length = tuples.length;
  while (length--) callback.call(context, tuples[length][0], tuples[length][1]);
}

bySortedValue({
  foo: 1,
  bar: 7,
  baz: 3
}, function(key, value) {
  document.getElementById('res').innerHTML += `${key}: ${value}<br>`
});
 <p id='res'>Result:<br/><br/><p>

原文由 Ben Blank 发布,翻译遵循 CC BY-SA 3.0 许可协议

我认为这就是您想要的,而不是在“关联数组”的语义上纠正您:

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

对于 真正的旧浏览器,请改用它:

 function getSortedKeys(obj) {
    var keys = []; for(var key in obj) keys.push(key);
    return keys.sort(function(a,b){return obj[b]-obj[a]});
}

你转储一个对象(像你的)并得到一个键数组 - 呃属性 - 返回,按(数字)值的(数字)值降序排列,呃,对象的值。

这仅在您的值是数字时才有效。 Tweek the little function(a,b) 在那里改变排序机制以工作升序,或工作 string 值(例如)。留给读者作为练习。

原文由 commonpike 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题