在javascript中组合对象数组以形成新数组

在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

我希望将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/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)}));