[英]How to compare if, 2 separate Objects/Array have one same element and concat 2 objects into one array, if there is matching element? Javascript
I have a promise.all that returns 2 objects.我有一个 promise.all 返回 2 个对象。 The common element in these 2 seperate objects is
room
.这两个独立对象中的共同元素是
room
。 I want both object to be in 1 array, and if the room matches, I would like to concat the objects.我希望两个对象都在 1 个数组中,如果房间匹配,我想连接这些对象。
const urls = ['/room/*/userconfig', '/room/*/observation/latest'];
let requests = urls.map(url => axios.get(url));
Promise.all(requests)
.then(res => {
let patientObjArray = Object.values(res[0].data);
let patientObservationsArray = Object.values(res[1].data);
})
const patientObjArray = [
{
room: "room18",
patient: "91911671-302b-47b5-a24d-d2a1fea548d6",
hospitalNumber: "12"
},
{
room: "room19",
patient: "b793bbba-b2bb-4995-9247-bb4d4f2be65a",
hospitalNumber: "13"
},
{
room: "room20",
patient: "a8e8efa1-ea00-4d32-b4b2-58727200b9b0",
hospitalNumber: "14"
},
{
room: "room21",
patient: "asdadddaddada-b4badasd2-7272a00qb9b0",
hospitalNumber: "15"
}
];
// patientObservationsArray is data related to patientObjArray.room
const patientObservationsArray = [
{
observation: {
room: "room18",
timestamp: "10:00",
patient: "91911671-302b-47b5-a24d-d2a1fea548d6"
},
comment: { value: "Ok" }
},
{
observation: {
room: "room19",
timestamp: "11:00",
patient: "b793bbba-b2bb-4995-9247-bb4d4f2be65a"
},
comment: { value: "Good" }
},
{
observation: {
room: "room20",
timestamp: "12:00",
patient: "a8e8efa1-ea00-4d32-b4b2-58727200b9b0"
},
comment: { value: "bad" }
}
];
expected output预期产出
const combinedArray = [
{
room: "room18",
patient: "91911671-302b-47b5-a24d-d2a1fea548d6",
hospitalNumber: "12",
timestamp: "10:00",
comment: "Ok"
},
{
room: "room19",
patient: "b793bbba-b2bb-4995-9247-bb4d4f2be65a",
hospitalNumber: "13",
timestamp: "11:00",
comment: "Good"
},
{
room: "room20",
patient: "a8e8efa1-ea00-4d32-b4b2-58727200b9b0",
hospitalNumber: "14",
timestamp: "12:00",
comment: "Bad"
},
{
room: "room21",
patient: "asdadddaddada-b4badasd2-7272a00qb9b0",
hospitalNumber: "15"
}
];
Here is my solution.这是我的解决方案。 Please try this code.
请试试这个代码。
const mergedArray = patientObjArray.map(obj => { const matched = patientObservationsArray.find(obs => obs.observation.room === obj.room); if (!!matched) { return { ...obj, ...matched.observation, comment: matched.comment.value }; } else { return obj; } }); console.log(mergedArray);
You can first flatten your patientObservationsArray
, then merge it with your patientObjArray
and finally use reduce
method to merge your array.您可以先展平您的
patientObservationsArray
,然后将其与您的patientObjArray
合并,最后使用reduce
方法合并您的数组。
There are probably better ways of doing this, feel free to give me suggestions.可能有更好的方法可以做到这一点,请随时给我建议。 This should solve your problem.
这应该可以解决您的问题。
const patientObjArray = [ { room: "room18", patient: "91911671-302b-47b5-a24d-d2a1fea548d6", hospitalNumber: "12" }, { room: "room19", patient: "b793bbba-b2bb-4995-9247-bb4d4f2be65a", hospitalNumber: "13" }, { room: "room20", patient: "a8e8efa1-ea00-4d32-b4b2-58727200b9b0", hospitalNumber: "14" }, { room: "room21", patient: "asdadddaddada-b4badasd2-7272a00qb9b0", hospitalNumber: "15" } ]; const patientObservationsArray = [ { observation: { room: "room18", timestamp: "10:00", patient: "91911671-302b-47b5-a24d-d2a1fea548d6" }, comment: { value: "Ok" } }, { observation: { room: "room19", timestamp: "11:00", patient: "b793bbba-b2bb-4995-9247-bb4d4f2be65a" }, comment: { value: "Good" } }, { observation: { room: "room20", timestamp: "12:00", patient: "a8e8efa1-ea00-4d32-b4b2-58727200b9b0" }, comment: { value: "bad" } } ]; const combinedArray = patientObservationsArray // flatten your patientObservationsArray .map(item => ({ ...item.observation, ...item.comment })) // concat to your patientObjArray .concat(patientObjArray) // use reduce method to merge your array .reduce((res, item) => { const { room } = item; const index = res.findIndex(i => i.room === room); if (index > -1) { // merge object if already exists res[index] = { ...res[index], ...item }; } else { // else push into your array res.push(item); } return res; }, []); console.log(combinedArray);
Here is a playcode plunkr for my suggestion: https://playcode.io/473861?tabs=script.js,preview,console这是我建议的 playcode plunkr: https ://playcode.io/473861?tabs = script.js,preview,console
We simply loop through the first array, run every object through a matching function against the second array and add the objects into a new array.我们简单地遍历第一个数组,通过匹配函数运行每个对象,然后将对象添加到新数组中。 If a match is found the required fields are added.
如果找到匹配项,则会添加必填字段。
I would suggest keeping the object structure similar just to make using the objects in new data easier.我建议保持对象结构相似,以便更轻松地在新数据中使用对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.