【问题标题】:Converting an object literal to a sorted Array将对象字面量转换为排序数组
【发布时间】:2012-12-04 01:45:46
【问题描述】:

我有一个对象字面量,它的键值是更多对象,内部对象的键之一被命名为“rank” - 并且具有浮点值。我想将对象文字转换为内部对象的数组,按“rank”的值排序。

输入对象:

{
452:{
     bla:123,
     dff:233,
     rank:2
  },
234:{
     bla:123,
     dff:233,
     rank:1
  }

}

输出数组:

[
 { bla:123, dff:233, rank:1},
 { bla:123, dff:233, rank:2 }
]

【问题讨论】:

  • 贴一些代码,最好是有问题的对象。
  • 我们需要查看要转换为数组的对象字面量代码。向我们展示代码。
  • Foks 将很乐意为您提供帮助,如果您展示您目前尝试过的代码。

标签: javascript arrays sorting


【解决方案1】:

例子:

var data = {
    foo: {
        rank: 5
    },
    bar: {
        rank: 2
    },
    baz: {
        rank: 8
    }
};

Javascript:

var mappedHash = Object.keys( data ).sort(function( a, b ) {
    return data[ a ].rank - data[ b ].rank;
}).map(function( sortedKey ) {
    return data[ sortedKey ];
});

这将首先通过obj.rank 的值将sort 内部对象,然后将map 包含对象放入一个数组。

结果:[{rank: 2}, {rank: 5}, {rank: 8}]


参考:Object.keys、Array.prototype.sort、Array.prototype.map


以上代码包含 ECMAscript 262 第 5 版代码,在所有现代浏览器中都可用。如果您还想支持旧版浏览器,则需要包含各种 ES5-Shim 库之一。

【讨论】:

    【解决方案2】:

    遍历对象的属性,将内部对象推入数组,然后使用自定义排序函数对数组进行排序:

    var inputObject = {}, // your object here
        arr = [];
    
    for (var k in inputObject)
        arr.push(inputObject[k]);
    
    arr.sort(function(a,b) { return a.rank - b.rank; });
    

    【讨论】:

    • 我正在尝试按照帮助部分中的说明使用“@”符号回复用户 nnnnnn。它不工作。我在其他帖子中也遇到过这个问题——使用我的 Mac 或 PC。当我在用户名前使用“@”符号时,它根本不会显示。我应该在哪里发布这样的问题?
    • 无论如何,对于nnnnnn,a.rank - b.rank在数组的排序方法中做了什么?谢谢。
    • @Chris22 .sort() 允许您传递一个函数,该函数将在需要对数组中的两个元素进行比较时调用 - a 和 b 是两个元素。如果在排序结果中a 应该在b 之后,则比较函数需要返回一个正数,如果a 应该在b 之前,则返回一个负数,如果a 和b 则返回0出于排序目的是相等的。在这种情况下,元素是具有数字 rank 属性的对象,因此 a.rank - b.rank 返回一个适当的值。
    • @Chris22 - 关于您使用@ 符号的困难,您不需要将它与您正在评论的答案或问题的人的用户名一起使用,他们会看到您的评论没有它。
    • 感谢您的解释,nnnnnn。我现在对两者都理解得更好了。 :)
    猜你喜欢
    • 2017-09-13
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-15
    • 1970-01-01
    相关资源
    最近更新 更多