下划线将对象转换为数组并按键名排序

时间:2015-03-29 11:09:35

标签: javascript arrays sorting underscore.js momentjs

我一直在使用下面的代码来转换计数数组中的大型日期列表,然后我可以在简单的折线图中使用它们。我遇到的问题是按年份和周数对值进行排序。当我有[{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(),但似乎期望一个命名键可以排序,在我的情况下,键名称都是不同的。我能用第一把钥匙做类似的事吗?

1 个答案:

答案 0 :(得分:3)

对于对象,sortBy也将键作为第二个参数传递给回调,并且只在对其进行排序后保留对象的值,因此:

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

给出

[ 4, 1 ]