javascript - 基于相同项对数组项进行排序并创建多维数组

标签 javascript angularjs sorting

所以我正在解决我问过的上一个问题 here ,其中我谈到了使用 AngularJS 从 JSON 文件创建历史时间线。本质上,JSON 文件包含一堆 HISTORY EVENTS 对象,每个对象都包含一个名为“theDate”的 ID,以指示这些唯一事件发生的日期。我想将所有事件分类到其特定的 DECADES 中,以便稍后在 View 中使用 CSS 进行导航。

我正在努力创建一个多维数组,其结构应该是这样的(这应该是 MASTER 数组):

[[all of 1960s events],[all of 1970s events], [all of 1980s events]...]

...其中 MASTER 数组中的每个特定数组都包含该特定十年的事件对象。 (例如,对于 1960 年代的数组,事件应包含年份 [ 1961, 1963, 1969,etc.]

使用 AngularJS,我的工作代码在这里:
        var events = $scope.events;

    function decadeSort(){

        var year;
        var arrayOfYears = [];


        for(var i = 0; i<events.length; i++){

            var date = new Date(events[i].theDate);
            year = date.getFullYear();

            var yearToString = year.toString();
            var yearToDecade = yearToString.substring(0,3).concat("0");
            arrayOfYears.push(yearToDecade);


        }
        console.log(arrayOfYears);
    };

    decadeSort();
arrayOfYears数组根据它们各自的 DECADE 打印出 267 个事件对象的所有年份,如下所示:
["1960","1960","1970","1970","1970","1980","1980","1990","1990","2000","2000"..]

随着该数组中的一些字符串对象重复,我希望根据哪些对象是相同的字符串在该数组中创建新数组。我不知道如何编写这个循环,所以任何见解和帮助将不胜感激。

太感谢了!

最佳答案

使用您发布的示例事件,以下是按十年分组的简单方法:

var grouped = {};

events.forEach(function (event) {
  var decade = Math.floor((new Date(event.theDate)).getFullYear() / 10) * 10;
  if (typeof grouped[decade] === 'undefined') {
    grouped[decade] = [];
  }

  grouped[decade].push(event);
});

console.log(grouped);

它正在使用 forEach 如果您的目标浏览器不支持它,您可能需要更改它。

关于javascript - 基于相同项对数组项进行排序并创建多维数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14462312/

相关文章:

Javascript:使用 || 减少函数

javascript - Angular是否接受带有连字符的属性?

c# - LINQ中对1000000条记录进行排序的最佳方法是什么

java - 如何按最低数字/字符串Android Studio对recyclerview进行排序

django - 一个人应该吃多少狗粮? -内部和外部RestAPI和Oauth2

java - 最小堆算法

javascript - ajaxForm 插件不断重定向到操作页面,忽略返回 false;

javascript - 将事件附加到动态创建的dom元素

javascript - 如何使用gulp-traceur和gulp-webpack?

javascript - 编写脚本来自动化 npm 命令