Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/444.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 如果至少有2个具有相同的属性值,则合并数组的元素_Javascript_Arrays_Merge_Filtering_Lodash - Fatal编程技术网

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值,因此足以将元素标记为非重复)。