【问题标题】:Javascript sort array by date keyJavascript按日期键排序数组
【发布时间】:2017-05-02 20:06:58
【问题描述】:

我有一个 javascript 循环,它遍历数据库中的一些注释并将它们连接成一个字符串以附加到 DOM。它使用noteType 作为键,因此我可以在多个选项卡上分隔不同类型的笔记。

问题是,我需要显示按日期排序的所有注释的组合视图。所以在循环结束时,我将注释附加到一个单独的变量,我称之为 combinedOutput 就目前而言,注释是每个笔记类型的正确日期顺序。但是,当需要将它们全部组合为一个时,两组正确排序的数组将按各自的顺序附加,并在最终输出中丢弃日期顺序。

这是我的代码示例:

// Define our vars
var output = [],
    combinedOutput = [],
    noteType = '',
    noteDate = new Date;

$(data).find('notes>data').each(function() {

    var $p = $(this);

    noteType = $p.find('noteType').text(),
    noteDate = moment.utc($p.find('timestampOrig').text()).toDate()

    if (typeof(output[noteType]) == 'undefined') {
        output[noteType] = "";
    }
    if (typeof(combinedOutput[noteDate]) == 'undefined') {
        combinedOutput[noteDate] = new Date;
    }

    // Create our note
    output[noteType] += '<div id="message_' + $p.find('recordID').text() + '" class="panel panel-default custom-panel item">';
    output[noteType] += 'Something Here';
    output[noteType] += '</div>';

    // Append to our final output variable
    combinedOutput[noteDate] += output[noteType];

});

日期示例

**Note Type: Public**
April 1, 2017
March 5, 2017
April 8, 2017

**Note Type: Private**
April 2, 2017
March 9, 2017
March 11, 2017

**Combined Notes:**
April 1, 2017
March 5, 2017
April 8, 2017
April 2, 2017
March 9, 2017
March 11, 2017

我的最终目标是按其键对combinedOutput 进行排序,该键恰好是一个日期对象。

这是combinedOutput 数组现在看起来没有排序的屏幕截图。

【问题讨论】:

  • javascript 中的对象永远不能保证被排序。如果顺序很重要,则应使用数组

标签: javascript arrays sorting


【解决方案1】:

您可以使用 Array.sort() 方法。 传递一个函数,您可以指定如何比较值。 这里是排序方法的链接:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort?v=example

因此,在您的示例中,从数组中的服务器获取数据。然后你可以用这种方式订购它们:你的输出可以有这样的东西:

resultArray.sort(function(a, b) {
  var dateA = new Date(a.noteDate);
  var dateB = new Date(b.noteDate);

  if (dateA < dateB ) {
    return -1;
  }
  if (dateA > dateB ) {
    return 1;
  }
  return 0;
});

然后,在您对数据进行排序后,重复您的过程以迭代它们并显示值。您应该已经订购了它们。

【讨论】:

  • 这将要求他们将noteDate 存储在数组内的对象上,而不是将其用作数组中的键(无论如何他们都应该这样做——如果两个音符具有相同的日期呢? ?)
  • 日期肯定在一个属性中。我只是将其命名为 noteDate,因为我不知道该属性的名称。然后使用对象的键,意味着与定义属性相同。如果日期相等,则返回 0。这就是一般比较的工作方式。
【解决方案2】:

这是Greate Answer

基本上使用 sort() 并在其中将您的日期转换为日期对象并进行比较。该链接将向您展示这是如何完成的。如果您将日期对象添加到数组中存储的对象中,排序会更快,这样您就不必在排序时构造和丢弃这么多对象。

【讨论】:

    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多