Javascript 使用匹配的对象键将JS对象数组推送到另一个对象数组

Javascript 使用匹配的对象键将JS对象数组推送到另一个对象数组,javascript,arrays,javascript-objects,Javascript,Arrays,Javascript Objects,我有一堆来自多个源的对象,我想合并它们,这样我就可以处理一个大对象,而不是5个或10个对象 假设我的包含员工基本数据的主对象数组,我希望将其他数组推送到它 var employees = [ {emp_id: 1, emp_name: "John D", phone:"123456"}, {emp_id: 2, emp_name: "Mary J", phone:"234567"}, {emp_id: 3, emp_name: "Doe J", phone:"345678"}, {emp_id:

我有一堆来自多个源的对象,我想合并它们,这样我就可以处理一个大对象,而不是5个或10个对象

假设我的包含员工基本数据的主对象数组,我希望将其他数组推送到它

var employees = [
{emp_id: 1, emp_name: "John D", phone:"123456"},
{emp_id: 2, emp_name: "Mary J", phone:"234567"},
{emp_id: 3, emp_name: "Doe J", phone:"345678"},
{emp_id: 4, emp_name: "Jane M", phone:"456789"}
]
以及另一个包含员工工作历史记录的对象数组:

var employee_history = [
{emp_id: 1, company: "ABC", Years: 4},
{emp_id: 2, company: "BCD", Years: 3},
{emp_id: 3, company: "CDE", Years: 2},
{emp_id: 4, company: "DEF", Years: 1}
]
以及最终的对象数组,其员工居住历史记录如下:

var cities_lived = [
{emp_id: 1, city: "Moscow", Years: 1},
{emp_id: 1, city: "Doha", Years: 1},
{emp_id: 2, city: "Cairo", Years: 2},
{emp_id: 2, city: "London", Years: 1},
{emp_id: 3, city: "Tunis", Years: 2},
{emp_id: 3, city: "Beijing", Years: 2},
{emp_id: 4, city: "New York", Years: 1},
{emp_id: 4, city: "Capetown", Years: 1}
]
因此,我想使用
emp\u id
属性将
employee\u history
cities\u lived
推送到
employees
中的各个对象中进行匹配,并有这样或类似的输出,只要它位于各个对象中:

[
{
emp_id: 1, 
emp_name: "John D", 
phone: "123456", 
company: "ABC", 
Years: 4, 
cities: [
    {emp_id: 1, city: "Doha", Years: "1"}, 
    {emp_id: 1, city: "Doha", Years: "1"}
] 
},
{},
{},
...
]
我怎样才能做到这一点


我的麻烦解决方案是循环每个对象数组并创建新对象,然后将数据推送到其中,最后将结果推送到主对象数组中。但是我不喜欢手动执行所有这些操作,即使这样,我也不确定如何将结果推送到主对象数组中,其中
emp\u id
属性匹配。

您需要迭代城市和历史数组,并以emp\u id作为键创建地图。 并插入到最终对象中

试试这个

var employees = [
{emp_id: 1, emp_name: "John D", phone:"123456"},
{emp_id: 2, emp_name: "Mary J", phone:"234567"},
{emp_id: 3, emp_name: "Doe J", phone:"345678"},
{emp_id: 4, emp_name: "Jane M", phone:"456789"}
]


var employee_history = [
{emp_id: 1, company: "ABC", Years: 4},
{emp_id: 2, company: "BCD", Years: 3},
{emp_id: 3, company: "CDE", Years: 2},
{emp_id: 4, company: "DEF", Years: 1}
]

var cities_lived = [
{emp_id: 1, city: "Moscow", Years: 1},
{emp_id: 1, city: "Doha", Years: 1},
{emp_id: 2, city: "Cairo", Years: 2},
{emp_id: 2, city: "London", Years: 1},
{emp_id: 3, city: "Tunis", Years: 2},
{emp_id: 3, city: "Beijing", Years: 2},
{emp_id: 4, city: "New York", Years: 1},
{emp_id: 4, city: "Capetown", Years: 1}
]


var cities_lived_obj = cities_lived.reduce(function(o,i){
   if(!o.hasOwnProperty(i.emp_id)){
       o[i.emp_id] = [];
   }
   o[i.emp_id].push(i);
   return o;
},{});

var employee_history_obj = employee_history.reduce(function(o,i){

   if(!o.hasOwnProperty(i.emp_id)){
       o[i.emp_id] = [];
   }
   o[i.emp_id].push(i);
   return o;
},{});

employees.forEach(function(emp){
  emp['cities'] = cities_lived_obj[emp.emp_id];
  emp['history'] = employee_history_obj[emp.emp_id];
});

console.log(employees);

jsiddle演示-

是的,这很简单。您只需要迭代雇员,并沿途构建对象,在循环结束时,您将获得所需的结果

var employees = [
  { emp_id: 1, emp_name: "John D", phone: "123456" },
  { emp_id: 2, emp_name: "Mary J", phone: "234567" },
  { emp_id: 3, emp_name: "Doe J", phone: "345678" },
  { emp_id: 4, emp_name: "Jane M", phone: "456789" }
];


var employee_history = [
  { emp_id: 1, company: "ABC", Years: 4 },
  { emp_id: 2, company: "BCD", Years: 3 },
  { emp_id: 3, company: "CDE", Years: 2 },
  { emp_id: 4, company: "DEF", Years: 1 }
];

var cities_lived = [
  { emp_id: 1, city: "Moscow", Years: 1 },
  { emp_id: 1, city: "Doha", Years: 1 },
  { emp_id: 2, city: "Cairo", Years: 2 },
  { emp_id: 2, city: "London", Years: 1 },
  { emp_id: 3, city: "Tunis", Years: 2 },
  { emp_id: 3, city: "Beijing", Years: 2 },
  { emp_id: 4, city: "New York", Years: 1 },
  { emp_id: 4, city: "Capetown", Years: 1 }
];

employees.forEach(employee => {
  const employeeHistory = employee_history.find(x => x.emp_id == employee.emp_id);
  employee = { ...employee, ...employeeHistory };
  const employeeCities = cities_lived.filter(x => x.emp_id === employee.emp_id);
  employee.cities = [];

  if (employeeCities && employeeCities.length > 0) {
    employee.cities = employeeCities;
  }
});

您可以尝试编写一些功能很少的小函数,并将它们组合成一个可以将项合并到一个项中的函数

然后,将所有需要与其合并功能合并的数据合并,并将员工减少到一个新的值,从而将所有内容合并

const employees=[{“emp_id”:1,“emp_name”:“John D”,“phone”:“123456”},{“emp_id”:2,“emp_name”:“Mary J”,“phone”:“234567”},{“emp_id”:3,“emp_name”:“Doe J”,“phone”:“345678”},{“emp_id”:4,“emp_name”:“Jane M”,“phone”:“456789”};
const employee_history=[{“emp_id”:1,“公司”:“ABC”,“年份”:4},{“emp_id”:2,“公司”:“BCD”,“年份”:3},{“emp_id”:3,“公司”:“CDE”,“年份”:2},{“emp_id”:4,“公司”:“DEF”,“年份”:1};
康斯特城市生活=[{“emp_id”:1,“城市”:“莫斯科”,“年”:1},{“emp_id”:1,“城市”:“多哈”,“年”:1},{“emp_id”:2,“城市”:“开罗”,“年”:2},{“emp_id”:2,“城市”:“伦敦”,“年”:1},{“emp_id”:3,“城市”:“突尼斯”,“年”:2},{“城市”:“北京”,“年”:2},{“emp_id”:4,“城市”:“纽约”,“城市”:“年”:1},{“城市”:;
constwhater=[{emp_id:1,whater:'whater'}]//合并项目的额外费用
//使用合并函数从uniqueArray中的合并数组合并项
//如果他们使用匹配器匹配
常量合并=(唯一数组、合并、匹配、合并)=>
uniqueArray.map((项)=>
合并(项目,合并过滤器(匹配器(项目)),
);
//使用映射结果创建合并函数集项[itemFieldName]
//使用mapper函数的其他用户的
常量合并=(itemFieldName,映射器)=>(
项目,,
其他,,
) => ({
…项目,
[itemFieldName]:others.map(映射器),
});
//emp_id上的匹配
常数matchEpmId=(项目)=>(其他)=>
item.emp_id==其他.emp_id;
console.log(
[
[
你居住的城市,
//合并函数,将item.cities与其他映射到{city,Years}的城市进行合并
合并(‘城市’,({城市,年份})=>({城市,年份}))
],
[
员工历史记录,
//将item.history与映射到{company,Years}的其他项一起设置的合并函数
合并(‘历史’,({公司,年份})=>({公司,年份}))
],
[
不管怎样,//合并项目的额外操作
合并('whater',({whater}=>whater),
],
].减少(
(结果,[其他,合并]=>
合并(结果、其他、匹配、合并),
员工,
),

);是,这是可能的。请添加您的尝试。