Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:从另一个数组创建数组_Javascript_Arrays - Fatal编程技术网

Javascript:从另一个数组创建数组

Javascript:从另一个数组创建数组,javascript,arrays,Javascript,Arrays,我有一个Firebase的阵列快照,其中包含我的应用程序的条目。在其他信息中,有一个称为“referenceDate”的时间戳: 我想输出按月份和年份分组在标题下的条目,如下所示 08.2017 03.08.2017 02.08.2017 01.08.2018 07.2017 03.07.2017 02.07.2017 我的想法是在阵列快照上循环并创建另一个嵌套快照,如下所示: {"monthYear": "08.2017":[ {"referenzDatum": 2017-08-0

我有一个Firebase的阵列快照,其中包含我的应用程序的条目。在其他信息中,有一个称为“referenceDate”的时间戳:

我想输出按月份和年份分组在标题下的条目,如下所示

08.2017
03.08.2017
02.08.2017
01.08.2018
07.2017
03.07.2017
02.07.2017
我的想法是在阵列快照上循环并创建另一个嵌套快照,如下所示:

 {"monthYear": "08.2017":[
    {"referenzDatum": 2017-08-03},... },
    {"referenzDatum": 2017-08-02},... },
    {"referenzDatum": 2017-08-01},... },]},
 {"monthYear": "07.2017":[
    {"referenzDatum": 2017-07-03},... },
    {"referenzDatum": 2017-07-02},... }, ...]}
然后使用两个嵌套的ngFor在其上循环以生成html输出

有没有一个简单的方法来实现这一点?每当发生变化时,我试图根据相应的monthyear将旧条目推送到新数组中,但没有成功,因为引用被复制了。 然后我尝试了下面的代码,但是它在两个多月内都不能正常工作,代码看起来很糟糕

var oldDate: string;
var newDate: string;
sortedLogLine.entries = [];
this.sortedLog = [];

for (var i = 0; i < entries.length; i++) {
  newDate = entries[i].referenceDate.substring(0, 7).split('-').reverse().join('.');
  if (oldDate == newDate) {
    sortedLogLine.entries.push(entries[i]);
  }
  if (!oldDate) {
    sortedLogLine.entries.push(entries[i]);
    sortedLogLine.monthYear = newDate;
    oldDate = newDate;
  }
  if (oldDate != newDate) {

    pushSortedLogLine.entries = sortedLogLine.entries.slice(0);
    pushSortedLogLine.monthYear = oldDate;
    this.sortedLog.push(pushSortedLogLine);

    sortedLogLine.entries = [];
    sortedLogLine.entries.push(entries[i]);
    sortedLogLine.monthYear = newDate;
    oldDate = newDate;
  }
}
this.sortedLog.push(sortedLogLine);
var oldDate:字符串;
var newDate:字符串;
sortedLogLine.entries=[];
this.sortedLog=[];
对于(变量i=0;i
关于如何更有效地做到这一点,有什么建议吗

看一看


我相信Lodash比underline.js更好,更多细节请参见通常的方法是
groupBy
。Javascript在其数组上没有本机groupBy方法,但有几个帮助程序库(如underline.js)有。或者,您也可以使用
reduce

let getMonthYear = (obj) => obj.referenceDate.split('-').reverse().slice(1).join('.');

let groupBy = (ary, fn) => ary.reduce(function(groups, item) {
       let key = fn(item)
       if (!groups[key]) groups[key]=[]
       groups[key].push(item)
       return groups;
   }, {});

let entries = [ { referenceDate: '2017-08-03' },
                { referenceDate: '2017-08-02' },
                { referenceDate: '2017-08-01' },
                { referenceDate: '2017-07-03' },
                { referenceDate: '2017-07-02' } ]
let groups = groupBy(entries, getMonthYear);
console.log(groups)
这将产生以下输出:

{ '08.2017': 
   [ { referenceDate: '2017-08-03' },
     { referenceDate: '2017-08-02' },
     { referenceDate: '2017-08-01' } ],
  '07.2017': 
   [ { referenceDate: '2017-07-03' },
     { referenceDate: '2017-07-02' } ] }

另请参见。

可能使用哈希表:

var timetable = {};

data.forEach(function(el){
  var d = new Date(el.referenceDate),
  y = d.getFullYear(),
  m = d.getMonths() +1;

  if(!timetable[y]) timetable[y] = [];
  if(!timetable[y][m]) timetable[y][m] = [];

  timetable[y][m].push(el);
});
然后,您可以获取所有可用年份,对它们进行排序并显示:

Object.values(timetable).sort((a,b)=>a-b).forEach(function(year){
  console.log(year);
  for(var [month,entries] of timetable[year].entries()){
     console.log(month,entries.join("\n"));
  }
});
试试这个:

const entries=[{referenceDate:'2017-08-03'},{referenceDate:'2017-08-02'},{referenceDate:'2017-08-01'},{referenceDate:'2017-07-03'},{referenceDate:'2017-07-02'}];
const resultObj={};
对于(变量i=0;i
你试过了吗?
Object.values(timetable).sort((a,b)=>a-b).forEach(function(year){
  console.log(year);
  for(var [month,entries] of timetable[year].entries()){
     console.log(month,entries.join("\n"));
  }
});
 var arrayOfDates = [
      {'referenceDate':'2017-08-03'},
      {'referenceDate':'2017-08-02'},
      {'referenceDate':'2017-08-01'},
      {'referenceDate':'2017-07-03'},
      {'referenceDate':'2017-07-02'}
   ];
  var result = [];

arrayOfDates.forEach(function(entry) {
    var date = new Date(entry.referenceDate);

    var day = date.getDate();
    var monthIndex = date.getMonth() +1;
    var year = date.getFullYear();

    var keyDateFormat = monthIndex+'.'+year;

    if(!(keyDateFormat in result)) {
        result[keyDateFormat] = [];
    }
    result[keyDateFormat].push(entry);
});