开发者社区> 问答> 正文

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

我有关联数组:

array["sub2"] = 1; array["sub0"] = -1; array["sub1"] = 0; array["sub3"] = 1; array["sub4"] = 0; 什么是按其值排序(降序)的最优雅方法,其中结果将是一个具有相应索引的数组:

sub2, sub3, sub1, sub4, sub0 ? 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-08 14:23:19 435 0
1 条回答
写回答
取消 提交回答
  • Javascript没有您所想到的“关联数组”。取而代之的是,您仅具有使用类似于数组的语法设置对象属性的能力(如您的示例),并且具有遍历对象属性的能力。

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

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

    Result:

    2020-02-08 14:23:34
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
JavaScript异步编程 立即下载
Delivering Javascript to World 立即下载
编程语言如何演化-以JS的private为例 立即下载