Home > database >  Node.js - How to merge objects inside an array based on condition?
Node.js - How to merge objects inside an array based on condition?

Time:12-28

In Node.js, I have 3 sets of data like

[
    {
        "userId":"54c7f3ef-64d4-40de-8100-d2ec81e8aaf3",
        "dailyData":159392.235451,
        "dailyDataInUSC":255.284807
    }
] 

and

[
    {
        "userId":"54c7f3ef-64d4-40de-8100-d2ec81e8aaf3",
        "monthlyData":159392.235451,
        "monthlyDataInUSC":255.284807
    }, 
    {
        "userId":"23fs6fds3-34k4-17de-3123-d2ec81e8aaf3",
        "monthlyData":349392.455451,
        "monthlyDataInUSC":655.234807
    }
] 

and

[
    {
        "userId":"54c7f3ef-64d4-40de-8100-d2ec81e8aaf3",
        "threeMonthsData":159392.235451,
        "threeMonthsDataInUSC":255.284807
    }, 
    {
        "userId":"23fs6fds3-34k4-17de-3123-d2ec81e8aaf3",
        "threeMonthsData":349392.455451,
        "threeMonthsDataInUSC":655.234807
    }, 
    {
        "userId":"34sdf34-67j4-54nd-6763-d2ec81e8aaf3",
        "threeMonthsData":6789392.455451,
        "threeMonthsDataInUSC":905.655807
    }
] 

How can I combine this to one object based on userId(filter) inside an array.

Eg, output should be like

[
    {
        "userId":"54c7f3ef-64d4-40de-8100-d2ec81e8aaf3",
        "dailyData":159392.235451,
        "dailyDataInUSC":255.284807,
        "monthlyData":159392.235451,
        "monthlyDataInUSC":255.284807,
        "threeMonthsData":159392.235451,
        "threeMonthsDataInUSC":255.284807
    }
]

Please help me to achieve this.

CodePudding user response:

A combination of spread, reduce and findIndex can be used to solve the problem.

  • Combine the original arrays into a single array using the spread operator.
  • Use reduce to group the elements by key (in this case userId)

Something like this :

const dailyData = [{"userId":"54c7f3ef-64d4-40de-8100-d2ec81e8aaf3","dailyData":159392.235451,"dailyDataInUSC":255.284807}];
const monthlyData = [{"userId":"54c7f3ef-64d4-40de-8100-d2ec81e8aaf3","monthlyData":159392.235451,"monthlyDataInUSC":255.284807}, {"userId":"23fs6fds3-34k4-17de-3123-d2ec81e8aaf3","monthlyData":349392.455451,"monthlyDataInUSC":655.234807}]
const triMonthlyData = [{"userId":"54c7f3ef-64d4-40de-8100-d2ec81e8aaf3","threeMonthsData":159392.235451,"threeMonthsDataInUSC":255.284807}, {"userId":"23fs6fds3-34k4-17de-3123-d2ec81e8aaf3","threeMonthsData":349392.455451,"threeMonthsDataInUSC":655.234807}, {"userId":"34sdf34-67j4-54nd-6763-d2ec81e8aaf3","threeMonthsData":6789392.455451,"threeMonthsDataInUSC":905.655807}]


const combinedData = [...dailyData, ...monthlyData, ...triMonthlyData].reduce((mergedResult, curElement) => {
  let matchingElementIdx = mergedResult.findIndex(ele => ele.userId === curElement.userId);

  if (matchingElementIdx !== -1) {
    mergedResult[matchingElementIdx] = {...mergedResult[matchingElementIdx], ...curElement};
  } else {
    mergedResult = [...mergedResult, curElement];
  }
  return mergedResult;
}, []);

console.log(combinedData);

CodePudding user response:

const aa = () => {
  let aa = [
    {
      userId: "54c7f3ef-64d4-40de-8100-d2ec81e8aaf3",
      dailyData: 159392.235451,
      dailyDataInUSC: 255.284807
    }
  ];

  let bb = [
    {
      userId: "54c7f3ef-64d4-40de-8100-d2ec81e8aaf3",
      monthlyData: 159392.235451,
      monthlyDataInUSC: 255.284807
    },
    {
      userId: "23fs6fds3-34k4-17de-3123-d2ec81e8aaf3",
      monthlyData: 349392.455451,
      monthlyDataInUSC: 655.234807
    }
  ];

  let cc = [
    {
      userId: "54c7f3ef-64d4-40de-8100-d2ec81e8aaf3",
      threeMonthsData: 159392.235451,
      threeMonthsDataInUSC: 255.284807
    },
    {
      userId: "23fs6fds3-34k4-17de-3123-d2ec81e8aaf3",
      threeMonthsData: 349392.455451,
      threeMonthsDataInUSC: 655.234807
    },
    {
      userId: "34sdf34-67j4-54nd-6763-d2ec81e8aaf3",
      threeMonthsData: 6789392.455451,
      threeMonthsDataInUSC: 905.655807
    }
  ];

  let newArrObj = aa;
  bb.forEach(item => {
    let index = newArrObj.findIndex(item1 => item1.userId === item.userId);
    if (index === -1) {
      newArrObj = [...newArrObj, item];
    } else {
      newArrObj[index] = { ...newArrObj[index], ...item };
    }
  });
  cc.forEach(item => {
    let index = newArrObj.findIndex(item1 => item1.userId === item.userId);
    if (index === -1) {
      newArrObj = [...newArrObj, item];
    } else {
      newArrObj[index] = { ...newArrObj[index], ...item };
    }
  });
  console.log(newArrObj);
};

CodePudding user response:

You can loop through every element of each array and use userId to group the objects.

const dailyData = [{"userId":"54c7f3ef-64d4-40de-8100-d2ec81e8aaf3","dailyData":159392.235451,"dailyDataInUSC":255.284807}];
const monthlyData = [{"userId":"54c7f3ef-64d4-40de-8100-d2ec81e8aaf3","monthlyData":159392.235451,"monthlyDataInUSC":255.284807}, {"userId":"23fs6fds3-34k4-17de-3123-d2ec81e8aaf3","monthlyData":349392.455451,"monthlyDataInUSC":655.234807}]
const triMonthlyData = [{"userId":"54c7f3ef-64d4-40de-8100-d2ec81e8aaf3","threeMonthsData":159392.235451,"threeMonthsDataInUSC":255.284807}, {"userId":"23fs6fds3-34k4-17de-3123-d2ec81e8aaf3","threeMonthsData":349392.455451,"threeMonthsDataInUSC":655.234807}, {"userId":"34sdf34-67j4-54nd-6763-d2ec81e8aaf3","threeMonthsData":6789392.455451,"threeMonthsDataInUSC":905.655807}]


const mergeAndGroupBy = (arrays, key) => {
    return Object.values(arrays.reduce((r, arr) => arr.reduce((nr, o) => {
        return (o[key] in nr ? nr[o[key]] = Object.assign(nr[o[key]], o) : nr[o[key]] = {...o}), nr
    }, r), {}))
} 

console.log(mergeAndGroupBy([dailyData, monthlyData, triMonthlyData], 'userId'));

  • Related