![](/img/trans.png)
[英]Merging/updating an object in an array with another array of object with matching key
[英]Push JS object array to another object array with matching object key
我有一堆來自多個來源的對象,我想合並,所以我可以使用一個大對象,而不是說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}
]
所以我想推employee_history
和cities_lived
到單個對象內部employees
使用emp_id
屬性相匹配,並有這樣或接近,只要它的單個對象里面的東西一個輸出:
[
{
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_id
屬性匹配的主對象數組中。
您需要遍歷城市和歷史數組,並通過emp_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);
JsFiddle演示 - https://jsfiddle.net/f3bh0eop/2/
是的,這很簡單。 您只需要遍歷員工並沿途構建對象,在循環結束時您將獲得所需的結果。
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,"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}]; const 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}]; const whatever = [{ emp_id: 1, whatever: 'whatever' }];//extra to merge item //merges items with the merger function from toMerge array in uniqueArray // if they match using matcher const mergeIn = (uniqueArray, toMerge, matcher, merger) => uniqueArray.map((item) => merger(item, toMerge.filter(matcher(item))), ); //create a merger function set item[itemFieldName] with a mapped result // of others using mapper function const merger = (itemFieldName, mapper) => ( item, others, ) => ({ ...item, [itemFieldName]: others.map(mapper), }); //match on emp_id const matchEpmId = (item) => (other) => item.emp_id === other.emp_id; console.log( [ [ cities_lived, //merger function that sets item.cities with others mapped to {city,Years} merger('cities', ({ city, Years }) => ({ city, Years})) ], [ employee_history, //merger function that sets item.history with others mapped to {company,Years} merger('history', ({ company, Years }) => ({ company, Years})) ], [ whatever,//extra to merge items merger('whatever', ({ whatever }) => whatever), ], ].reduce( (result, [other, merger]) => mergeIn(result, other, matchEpmId, merger), employees, ), );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.