【问题标题】:Underscore convert object to array and sort by key name下划线将对象转换为数组并按键名排序
【发布时间】:2015-03-29 11:09:35
【问题描述】:

我一直在使用下面的代码来转换一个计数数组中的大量日期列表,然后我可以在一个简单的折线图中使用它。我遇到的问题是按年份和周数对值进行排序。当我有[{201501: 20},{201502: 20},{201451: 20},{201452: 20}] 之类的数据时,我需要按键名将数组排序为以下格式[{201451: 20},{201452: 20},{201501: 20},{201502: 20}]。他们我只是用_.values()丢弃了密钥

如何使用下划线对数组进行排序,我尝试了一些方法,但此时我很迷茫。

    var graphData = _.chain(thisYearFiltered)
    // map each string like '2014-01-01 00:00:00' using moment.js to the ISO Week. ISO weeks are used because they run Monday to Sunday
    .map(function(date){ 
        return moment(date, "YYYY-MM-DD HH:mm:ss").isoWeekYear() + moment(date, "YYYY-MM-DD HH:mm:ss").isoWeek(); 
    })
    // Manipulate weeks numbers [201423,201423,201423,201423,201424] into a count for each like [{201423:4 },{201424:1}]
    .countBy(function(num) {
        //console.log(num);
        return num;
    })
    // Pull out the values of the objects and discard the week number. [{23:4 },{24:1}] to [4,1]
    .values()
    .value();

我知道这一切都可以用下划线来实现,但我已经用这个碰了壁,所以欢迎任何建议。

我已经查看了_.sortBy(),但这似乎期望一个命名键进行排序,在我的情况下,键名都是不同的。我可以用第一个键做类似的事情吗?

【问题讨论】:

    标签: javascript arrays sorting underscore.js momentjs


    【解决方案1】:

    对于对象,sortBy 也将 key 作为第二个参数传递给回调,并且只保留对象排序后的值,所以:

    _.chain([201423, 201423, 201423, 201423, 201424]).
       countBy(function(n) { return n; }).
       sortBy(function(v, k) { return k; }).
       value()
    

    给予

    [ 4, 1 ]
    

    【讨论】:

    • 感谢您的宝贵时间,祝您有美好的一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    • 1970-01-01
    • 2015-10-05
    • 1970-01-01
    • 2017-03-15
    • 2023-01-19
    • 2016-05-10
    相关资源
    最近更新 更多