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

时间:2017-08-10 18:39:18

标签: javascript arrays

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

pwd
cd /
pwd

我想按月份和年份输出按标题分组的条目

/

我的想法是遍历数组快照并创建另一个嵌套的,如下所示:

entry [0] { referenceDate: 2017-08-03,...
entry [1] { referenceDate: 2017-08-02,...
entry [2] { referenceDate: 2017-08-01,...
entry [3] { referenceDate: 2017-07-03,...
entry [4] { referenceDate: 2017-07-02,...

然后使用两个嵌套的ngFor循环遍历它以生成html输出。

有没有简单的方法来实现这一目标?我尝试只是根据相应的月份将旧条目推送到新数组中,只要这个更改,但是没有成功,因为引用被复制了。 然后我尝试了下面的代码,但它实际上并没有超过2个不同的月份,代码看起来很糟糕。

08.2017
03.08.2017
02.08.2017
01.08.2018
07.2017
03.07.2017
02.07.2017

有关如何更有效地执行此操作的任何建议?

5 个答案:

答案 0 :(得分:1)

执行此类操作的常用方法是groupBy。 Javascript在其Arrays上没有本机groupBy方法,但是像underscore.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' } ] }

另见this similar question

答案 1 :(得分:1)

 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);
});

答案 2 :(得分:0)

查看Lodash, specifically groupBy

我相信Lodash是比Underscore.js更好的选择,更多细节见this blog post

答案 3 :(得分:0)

可能使用哈希表:

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"));
  }
});

答案 4 :(得分:0)

试试这个:



const entries = [{ referenceDate: '2017-08-03'}, { referenceDate: '2017-08-02'}, { referenceDate: '2017-08-01'}, { referenceDate: '2017-07-03'}, { referenceDate: '2017-07-02'}]; 
const resultObj = {};

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

const out = document.getElementsByClassName('json')[0];
out.innerHTML = JSON.stringify(resultObj, undefined, 2);
&#13;
<pre class="json"></pre>
&#13;
&#13;
&#13;