对我来说,以排序的方式检索这些信息的最佳方式是什么

What is the best way for me to retrieve this information in a sorted manner?

本文关键字:方式 信息 最佳 是什么 检索 排序 对我来说      更新时间:2023-09-26

情况:我有一段类似的代码

var DealsByMonth = {};
for (var region in this.DealsByRegion) {
    this.DealsByRegion[region].forEach(function (deal) {
        //  deal.Created is in form like "2015-05-04T08:26:38Z"
        var parts = deal.Created.split('-'),
            monthstr = [parseInt(parts[1]), parseInt(parts[0])].join("/");
        if (DealsByMonth[monthstr] !== undefined) {
            ++DealsByMonth[monthstr]
        } else {
            DealsByMonth[monthstr] = 0;
        }
    });
}
console.log(DealsByMonth); // TEST
 var line_data = {
    labels: [],
    datasets: [
        {
            label: "MSfC Deals - Month by Month",
            fillColor: "rgba(220,220,220,0.2)",
            strokeColor: "rgba(220,220,220,1)",
            pointColor: "rgba(220,220,220,1)",
            pointStrokeColor: "#fff",
            pointHighlightFill: "#fff",
            pointHighlightStroke: "rgba(220,220,220,1)",
            data: []
        }
    ]
 }; 
 for ( var key in DealsByMonth ) 
 {
    line_data.labels.push(key);
    line_data.data.push(DealsByMonth[key]);
 }

打印的是像这样的对象

{1/2015: 6, 2/2015: 14, 3/2015: 15, 4/2015: 24, 5/2015: 33, 6/2015: 16, 7/2015: 14, 8/2015: 22, 9/2015: 29, 10/2014: 41, 11/2014: 9, 11/2015: 14, 12/2014: 1, 12/2015: 32}

我需要从该对象中提取关键点,但我需要按的顺序遍历它们,因为我使用它们来绘制折线图。要么我需要按顺序遍历它们,要么我需要重做我的代码,使它们处于已经有序的数据结构中。

在优雅、高效、可读性等方面,正确的方法是什么。?

在我的脑海中,对密钥进行排序,然后使用排序顺序

Object.keys(DealsByMonth).sort(function(a, b) {
    var sa = a.split('/'); // index 0 = month, 1 = year
    var sb = b.split('/');
    var index = (sa[1] == sb[1]) ? 0 : 1; // if year is same, compare months
    return parseFloat(sa[index]) - parseFloat(sb[index]);
}).forEach(function(key) {
    line_data.labels.push(key);
    line_data.data.push(DealsByMonth[key]);
});

类似于这个答案,

multiSort(DealsByMonth);
function multiSort(object) {
  var months = Object.keys(object);
  months.sort(function(a, b) {
    var m1 = a.split('/')[0];
    var m2 = b.split('/')[0];
    var y1 = a.split('/')[1];
    var y2 = b.split('/')[1];
    if (y1 < y2) return -1;
    if (y1 > y2) return 1;
    if (parseInt(m1) < parseInt(m2)) return -1;
    if (parseInt(m1) > parseInt(m2)) return 1;
    return 0;
  });
  var reorderedObj = {};
  for (var i = 0; i < months.length; i++) {
    reorderedObj[months[i]] = object[months[i]];
  }
  return reorderedObj;
}

如果您希望数据在对象中正确排序,您应该以正确比较的方式(您希望的方式)保留键。当比较两个日期时,首先要比较的是它们的年份、月份和日期。在您的代码中,您保留了年前的一个月,例如:"1/2015",如果您希望它正确排序,这是不正确的,因为基于这种格式,"4/2014"位于"1/2015"之后,这不是您想要的。

所以我建议你把年份放在前面,把月份放在后面,改变:

monthstr = [parseInt(parts[1]), parseInt(parts[0])].join("/");

至:

monthstr = [parseInt(parts[0]), parseInt(parts[1])].join("/");