在javascript中组合对象数组以形成新数组
我希望将2个对象数组合并为1,方法是按天对它们进行匹配,并生成一个新的对象数组,而不是包含原始2个对象的相关数据。目前我有以下两个:在javascript中组合对象数组以形成新数组,javascript,arrays,Javascript,Arrays,我希望将2个对象数组合并为1,方法是按天对它们进行匹配,并生成一个新的对象数组,而不是包含原始2个对象的相关数据。目前我有以下两个: [ { date: '9/30/2017', day: 'saturday' }, { date: '10/1/2017', day: 'sunday' }, { date: '10/2/2017', day: 'monday' }, { date: '10/3/2017', day: 'tuesday' }, { date: '10/4/20
[
{ date: '9/30/2017', day: 'saturday' },
{ date: '10/1/2017', day: 'sunday' },
{ date: '10/2/2017', day: 'monday' },
{ date: '10/3/2017', day: 'tuesday' },
{ date: '10/4/2017', day: 'wednesday' },
{ date: '10/5/2017', day: 'thursday' },
{ date: '10/6/2017', day: 'friday' },
{ date: '10/7/2017', day: 'saturday' },
{ date: '10/8/2017', day: 'sunday' },
{ date: '10/9/2017', day: 'monday' },
{ date: '10/10/2017', day: 'tuesday' }
]
及
我的代码如下所示:
function finalFormat (a, d) {
var combined = a.concat(d)
var final = _(combined)
.groupBy('day')
.map(_.spread(_.assign))
.value()
return final
}
但是我返回的数组:
[
{
date: '10/7/2017',
day: 'saturday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 10 }, { startTime: 13, stopTime: 18 } ]
},
{
date: '10/8/2017',
day: 'sunday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 15 } ]
},
{
date: '10/9/2017',
day: 'monday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 10 }, { startTime: 15, stopTime: 20 } ]
},
{
date: '10/10/2017',
day: 'tuesday',
totalHours: 3,
serveTimes: [ { startTime: 2, stopTime: 5 } ]
},
{
date: '10/4/2017',
day: 'wednesday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 15 } ]
},
{
date: '10/5/2017',
day: 'thursday',
totalHours: 5,
serveTimes: [ { startTime: 5, stopTime: 7 }, { startTime: 20, stopTime: 23 } ]
},
{
date: '10/6/2017',
day: 'friday',
totalHours: 5,
serveTimes: [ { startTime: 5, stopTime: 10 } ]
}
]
只有7个日期的信息,我需要每个日期的信息。所以它应该是这样的:
[
{
date: '9/30/2017',
day: 'saturday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 10 }, { startTime: 13, stopTime: 18 } ]
},
{
date: '10/1/2017',
day: 'sunday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 15 } ]
},
{
date: '10/2/2017',
day: 'monday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 10 }, { startTime: 15, stopTime: 20 } ]
},
{
date: '10/3/2017',
day: 'tuesday',
totalHours: 3,
serveTimes: [ { startTime: 2, stopTime: 5 } ]
},
{
date: '10/7/2017',
day: 'saturday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 10 }, { startTime: 13, stopTime: 18 } ]
},
{
date: '10/8/2017',
day: 'sunday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 15 } ]
},
{
date: '10/9/2017',
day: 'monday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 10 }, { startTime: 15, stopTime: 20 } ]
},
{
date: '10/10/2017',
day: 'tuesday',
totalHours: 3,
serveTimes: [ { startTime: 2, stopTime: 5 } ]
},
{
date: '10/4/2017',
day: 'wednesday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 15 } ]
},
{
date: '10/5/2017',
day: 'thursday',
totalHours: 5,
serveTimes: [ { startTime: 5, stopTime: 7 }, { startTime: 20, stopTime: 23 } ]
},
{
date: '10/6/2017',
day: 'friday',
totalHours: 5,
serveTimes: [ { startTime: 5, stopTime: 10 } ]
}
]
作为js的新手,我即将放弃。你们这些聪明的人能帮我吗
let a = [
{ date: '9/30/2017', day: 'saturday' },
{ date: '10/1/2017', day: 'sunday' },
{ date: '10/2/2017', day: 'monday' },
{ date: '10/3/2017', day: 'tuesday' },
{ date: '10/4/2017', day: 'wednesday' },
{ date: '10/5/2017', day: 'thursday' },
{ date: '10/6/2017', day: 'friday' },
{ date: '10/7/2017', day: 'saturday' },
{ date: '10/8/2017', day: 'sunday' },
{ date: '10/9/2017', day: 'monday' },
{ date: '10/10/2017', day: 'tuesday' }
];
let b = [
{
day: 'sunday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 15 } ]
},
{
day: 'monday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 10 }, { startTime: 15, stopTime: 20 } ]
},
{
day: 'tuesday',
totalHours: 3,
serveTimes: [ { startTime: 2, stopTime: 5 } ]
},
{
day: 'wednesday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 15 } ]
},
{
day: 'thursday',
totalHours: 5,
serveTimes: [ { startTime: 5, stopTime: 7 }, { startTime: 20, stopTime: 23 } ]
},
{
day: 'friday',
totalHours: 5,
serveTimes: [ { startTime: 5, stopTime: 10 } ]
},
{
day: 'saturday',
totalHours: 10,
serveTimes: [ { startTime: 5, stopTime: 10 }, { startTime: 13, stopTime: 18 } ]
}
];
let newArray = [];
a.forEach(function(aValue){
b.forEach(function(bValue){
if(aValue.day === bValue.day){
aValue.totalHours = bValue.totalHours;
aValue.serveTimes = bValue.serveTimes;
}
});
newArray.push(aValue);
});
使用
map
,filter
,reduce
,有许多方法可以简化此过程,但这是一个可以使用的想法。您可以使用map
方法。此外,我们可以使用集合使O(1)
在映射集合时访问项目:
const uniqueDays = new Map(secondArray.map(s => [s.day, s]));
const result = firstArray.map(({date, day})=> ({date, ...uniqueDays.get(day)}));
例如:
const firstArray=[
{日期:2017年9月30日,日期:周六},
{日期:2017年1月10日,日期:周日},
{日期:2017年10月2日,日期:星期一},
{日期:2017年3月10日,日期:星期二},
{日期:2017年4月10日,日期:星期三},
{日期:2017年5月10日,日期:星期四},
{日期:2017年6月10日,日期:星期五},
{日期:2017年7月10日,日期:周六},
{日期:2017年8月10日,日期:周日},
{日期:2017年9月10日,日期:星期一},
{日期:2017年10月10日,日期:星期二}
];
const secondArray=[
{
日:"星期日",,
总时数:10,
服务时间:[{开始时间:5,停止时间:15}]
},
{
日期:'星期一',
总时数:10,
服务时间:[{startTime:5,stopTime:10},{startTime:15,stopTime:20}]
},
{
日期:'星期二',
总时数:3,
服务时间:[{开始时间:2,停止时间:5}]
},
{
日:"星期三",,
总时数:10,
服务时间:[{开始时间:5,停止时间:15}]
},
{
日:"星期四",,
总时数:5,
服务时间:[{startTime:5,stopTime:7},{startTime:20,stopTime:23}]
},
{
日期:'星期五',
总时数:5,
服务时间:[{开始时间:5,停止时间:10}]
},
{
日期:'星期六',
总时数:10,
服务时间:[{startTime:5,stopTime:10},{startTime:13,stopTime:18}]
}
];
const uniqueDays=新映射(secondArray.Map(s=>[s.day,s]);
const result=firstArray.map(({date,day})=>({date,…uniqueDays.get(day}));
控制台日志(结果)代码>您的数组大小不均匀——第一个数组有11个对象,而第二个数组只有7个对象
- 通过比较size与
.length
属性,找出哪个数组更大
- 指定一个所有对象共有的键(即
“day”
)
- 循环遍历较大的数组(即第一个数组——在演示中称为
日期
)
- 在较大数组的每次迭代中,循环通过较小数组(即第二个数组——在演示中称为
hours
)找到当前对象的键,然后将其值与较小数组的对象的值匹配。例如,dates
中的对象有“day”:“friday”
必须与hours
中有“day”:“friday”
的对象相匹配
- 在每次匹配时,将对象与
Object.assign()
合并
演示
let dates=[{date:“9/30/2017”,day:“星期六”},{date:“10/1/2017”,day:“星期日”},{date:“10/3/2017”,day:“星期二”},{date date:“10/4/2017”,day:“10/5/2017”,day:“星期四”},{date date 10/6/2017,day:“星期五”},{date day:“10/7/2017”,day:“星期六”{day:“10/8/2017”,day:“星期一”{,{日期:“2017年10月10日”,日期:“星期二”},小时数=[{日期:“星期日”,总小时数:10,服务时间:[{开始时间:5,停止时间:15}]},{日期:“星期一”,总小时数:10,服务时间:[{开始时间:5,停止时间:10},{开始时间:15,停止时间:20},{日期:“星期二”,总小时数:3,服务时间:[{开始时间:2,停止时间:5},{日期:“星期三”,总小时数:10,服务时间:5,停止时间:5,停止时间:15}“星期四”,总时数:5,服务时间:[{开始时数:5,停止时数:7},{开始时数:20,停止时数:23}},{天:“星期五”,总时数:5,服务时间:[{开始时数:5,停止时数:10},{天:“星期六”,总时数:10,服务时间:[{开始时数:5,停止时数:10},{开始时数:13,停止时数:18}];
const mergeByKV=(key,objectArrayA,objectArrayB)=>{
让初级,次级;
if(objectArrayA.length>objectArrayB.length){
primary=[…objectArrayA];
次要=[…objectArrayB];
}否则{
primary=[…objectArrayB];
次要=[…objectArrayA];
}
让结果=[];
for(让objectA作为主对象){
设valueA=objectA[key];
对于(让第二个对象B){
设valueB=objectB[key];
如果(valueA==valueB){
push(Object.assign(objectA,objectB));
}
}
}
返回结果;
};
施工进度表=mergeByKV(“天”、日期、小时);
log(JSON.stringify(schedule,null,2));
也许你可以看看reduce()
:
const uniqueDays = new Map(secondArray.map(s => [s.day, s]));
const result = firstArray.map(({date, day})=> ({date, ...uniqueDays.get(day)}));