Javascript 如果至少有2个具有相同的属性值,则合并数组的元素
我有一组对象,它们具有以下结构:Javascript 如果至少有2个具有相同的属性值,则合并数组的元素,javascript,arrays,merge,filtering,lodash,Javascript,Arrays,Merge,Filtering,Lodash,我有一组对象,它们具有以下结构: days : string // "mo","tu","we".. time : string // "9am - 3pm" 有时,当我有两个(甚至更多)对象具有相同的days值时,就会发生这种情况。在这种情况下,我需要合并这些项目(更改timevalue,合并来自“相同”项目的值) var数组=[{ 天:“莫,屠,我们,th”, 时间:“上午9点至下午3点” }, { 天:“莫,屠,我们,th”, 时间:“下午5点至9点” }, { 天:“萨,苏”, 时间
days : string // "mo","tu","we"..
time : string // "9am - 3pm"
有时,当我有两个(甚至更多)对象具有相同的days
值时,就会发生这种情况。在这种情况下,我需要合并这些项目(更改time
value,合并来自“相同”项目的值)
var数组=[{
天:“莫,屠,我们,th”,
时间:“上午9点至下午3点”
}, {
天:“莫,屠,我们,th”,
时间:“下午5点至9点”
}, {
天:“萨,苏”,
时间:“上午9点至下午2点”
}];
var newArr=[];
对于(var i=0;i 控制台日志(newArr)代码>使用将项目按天分组,然后应用于每个组:
var数组=[{
天:“莫,屠,我们,th”,
时间:“上午9点至下午3点”
}, {
天:“莫,屠,我们,th”,
时间:“下午5点至9点”
}, {
天:“萨,苏”,
时间:“上午9点至下午2点”
}];
变量结果=(数组)
.groupBy(“天”)
.map(功能(天){
返回{.mergeWith.apply({,[{}].concat(天,函数(obj,src,key){
如果(键=='time'&&obj&&src){
返回[obj,src].join(',);
}
}));
})
.values()
.value();
控制台日志(结果)代码>
您可以在javascript中使用2个循环,而无需任何库:
var数组=[{
天:“莫,屠,我们,th”,
时间:“上午9点至下午3点”
}, {
天:“莫,屠,我们,th”,
时间:“下午5点至9点”
}, {
天:“萨,苏”,
时间:“上午9点至下午2点”
}];
tmp={};
array.forEach(函数(项){
if(tmp.hasOwnProperty(项目天数)){
tmp[item.days]=tmp[item.days]+','+item.time;
}否则{
tmp[项目天数]=项目时间;
}
});
res=[];
用于(tmp中的var天数){
res.push({'days':天,时间:tmp[days]});
}
控制台日志(res)
您可以使用此ES6功能,它依赖于Set
和Map
实例来完成其工作:
函数组天数(数组){
返回数组.from(
array.reduce((acc,{days,time})=>
acc.set(天,(acc.get(天)| | new set()).add(时间)),
新地图()),
([days,times])=>({days,time:[…times].join(',')})
);
}
//样本数据
变量数组=[{
天:“莫,屠,我们,th”,
时间:“上午9点至下午3点”
}, {
天:“莫,屠,我们,th”,
时间:“下午5点至9点”
}, {
天:“萨,苏”,
时间:“上午9点至下午2点”
}];
//团体
数组=groupDays(数组);
//结果
console.log(数组)代码>您可以使用对象引用并稍加修改来获得预期的结果
如果不想修改原始数组,可以将数组的一部分传递给函数
var-arr=[{
天:“莫,屠,我们,th”,
时间:“上午9点至下午3点”
}, {
天:“莫,屠,我们,th”,
时间:“下午5点至9点”
}, {
天:“萨,苏”,
时间:“上午9点至下午2点”
}];
console.log(u.uniqWith(arr,function)(a,b){
如果(a.天===b.天){
b、 时间+=','+a.时间;
返回true;
}
}));代码>
您确定要这个吗?如果你加入这样的时间,这些时间似乎适用于同一对象中的所有日子,这是不正确的。@trincot,为什么?我从一个源获得响应,格式为分组的天数和时间(对象中的所有天数都有此时间)。。。但是,如果某些商店在几天内有休息时间,我会得到当天的2倍“时间”:如果在周一,商店从上午9点工作到下午2点,然后休息,然后再从下午4点工作到晚上9点-响应将返回2个对象的数组[{days:“mo”,time:“9am-2pm”},{days:“mo”,time:“4pm-9pm”}
。因此,我认为我的想法是正确的,不是吗?在那个例子中,这是可以的,但是如果在第一个对象的days
属性中提到了多天,并将其与单日第二个对象结合起来:[{days:“mo,tu”,time:“9am-2pm”},{days:“mo”,time:“4pm-9pm”}
,你会怎么做?这个结果可能会让人对周二下午感到困惑:[{days:“mo,tu”,time:“9am-2pm,4pm-9pm”}]
@trincot,你是对的,但正如我所知,这种情况是不可能的,因为服务器返回的是正确分组的天数。但我会再次检查它,感谢lodash
已经在项目中,使用这种方法没有问题。这就是为什么我写了一篇关于lodash的有疑问的文章,有时候库的开销是不需要的(如果有人在没有lodash的情况下搜索解决方案,他可以使用这个):)只使用一种方法。整洁的看起来您也不需要返回true
,因此只有3行代码:O@bfred.it谢谢遗憾的是,您确实需要return语句来删除重复的条目(不需要return false,因为undefined是一个falsy值,因此足以将元素标记为非重复)。