javascript按日期对元素进行分组
我在js中有一个对象数组,格式如下: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'} ]; 我想从上面的数组中创建一个新数组,将对象分组到日期相同的数组中。
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这与哪个答案相同?除了使用逻辑空赋值外,接受的答案。