javascript按日期对元素进行分组

javascript按日期对元素进行分组,javascript,arrays,Javascript,Arrays,我在js中有一个对象数组,格式如下: let arr = [{name:'bill',date:'2021-04-28T00:00:00'} , {name:'nick',date:'1999-12-02T00:00:00'}, {name:'john',date:'2021-04-28T00:00:00'} , {name:'patrick',date:'1999-12- 02T00:00:00'} ]; 我想从上面的数组中创建一个新数组,将对象分组到日期相同的数组中。

我在js中有一个对象数组,格式如下:

let arr = [{name:'bill',date:'2021-04-28T00:00:00'} , {name:'nick',date:'1999-12-02T00:00:00'},
           {name:'john',date:'2021-04-28T00:00:00'} , {name:'patrick',date:'1999-12- 02T00:00:00'} ];
我想从上面的数组中创建一个新数组,将对象分组到日期相同的数组中。上述示例:

let grouped = [ [ {name:'bill','date':'2021-04-28T00:00:00'} , 
                 {name:'john','date':'2021-04-28T00:00:00'} ] , 
                [
                   {name:'nick','date':'1999-12-02T00:00:00'},
                   {name:'patrick','date':'1999-12-02T00:00:00'}
                ] 
              ]; 
我下面的代码适用于2,4个对象的小型数据集,但覆盖更多对象的数据并创建重复的数组

const groupByDates = (array)=>{
  
  let grouped = [];
 
  for(let i=0;i<array.length;i++){
      
      grouped.push([array[i]]); //create [] and push element 
      for(let j=i+1;j<array.length;j++){
        if(array[j].date===array[i].date){ 
          grouped[i].push(array[j]); // if element has same date push to array 
          let index = array.indexOf(array[j].date);
          array.splice(index,1); //remove item from array 
        }
      } 
      //remove item from array after iteration 
      let index = array.indexOf(array[i].date);
      array.splice(index,1);
  }
  return grouped;
}




let arr = [{name:'bill',date:'2021-04-28T00:00:00'} 
            , {name:'nick',date:'1999-12-02T00:00:00'},
              {name:'john',date:'2021-04-28T00:00:00'} , 
              {name:'patrick',date:'1999-12- 02T00:00:00'}, 
              {name:'bruce',date:'1999-12- 02T00:00:00'} ,
              {name:'mary',date:'1999-12- 02T00:00:00'} ,
          
            ];


let group = groupByDates(arr);

console.log(group);
constgroupbydates=(数组)=>{
设分组=[];
对于(设i=0;i这里有一种方法

let arr = [{name:'bill',date:'2021-04-28T00:00:00'} , {name:'nick',date:'1999-12-02T00:00:00'},
           {name:'john',date:'2021-04-28T00:00:00'} , {name:'patrick',date:'1999-12- 02T00:00:00'} ];


let tmpObj = {}
arr.forEach(item => {
//convert date to an acceptable identifier
var d = "D_" + item.date.replace(/[^a-zA-Z0-9]/g, "");
if (tmpObj[d]) {
  tmpObj[d].push(item);
} else {
  tmpObj[d] = [item]
}
});

let finalarr=[]
for(var x in tmpObj) finalarr.push(tmpObj[x])

console.log(finalarr)
您可以对对象使用
Array#reduce
来存储每个日期的值

let arr=[{姓名:'bill',日期:'2021-04-28500:00:00'},{姓名:'nick',日期:'1999-12-02T00:00:00'},
{姓名:'john',日期:'2021-04-28T00:00:00'},{姓名:'patrick',日期:'1999-12-02T00:00:00'}];
让res=Object.values(arr.reduce)(acc,curr)=>(
(附件[当前日期]??=[])推送(当前),附件
), {}));
console.log(res);

作为控制台包装{max height:100%!important;top:0}
您可以使用javascript对象并将日期用作键

const arr=[{
姓名:'比尔',
日期:2021-04-28:00:00
},
{
姓名:'尼克',
日期:“1999-12-02T00:00:00”
},
{
姓名:'约翰',
日期:2021-04-28:00:00
},
{
姓名:'帕特里克',
日期:“1999-12-02T00:00:00”
}
];
常量映射={};
arr.forEach(ele=>{
if(映射[ele.date])映射[ele.date]。推送(ele);
else映射[ele.date]=[ele];
});
常量分组=对象值(映射);

console.log(grouped);
这不是我想要的,只是将其标记为重复。这是与我标记的8年前的重复项相同的答案。@VasilisSkentos我已更新了答案。数据集中有一个打字错误。@pilchard这与哪个答案相同?除了使用逻辑空赋值外,接受的答案。