Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Javascript: object map reduce logic not working

I have the following data structure and script, I am trying to list the recipient’s subscriptions in two formats, one showing the subscriptions under services key with true or false (done – working) and the other one servicesDEV im currently struggling with, i want the subscribed ids listed i.e subs:[3218143,8956799] Here are the history of my painful tries https://jsfiddle.net/aectk8v1/8/

let recipients = [
{"id":"666777","lawfulBasis":"0","jurisdiction":"AMER","name":"David G"},
{"id":"888999","lawfulBasis":"1","jurisdiction":"ASIA","name":"Mike A"},
{"id":"444555","lawfulBasis":"2","jurisdiction":"EUR","name":"John No Sub"}
];

let serviceSubscriptions =  [
{"recipientId":"666777","serviceId":"3218143"},
{"recipientId":"666777","serviceId":"8956799"},
{"recipientId":"888999","serviceId":"15656200"},
{"recipientId":"000000","serviceId":"3721"}
];


const recipientObj = recipients.map(({id,...recipient}) => {

      return {
            id,
          isSubscribed: serviceSubscriptions.some(( subs ) => subs.recipientId ===id),          

           /* my data structure for services key is concatenated i think is wrong
example: ["3218143:true", "8956799:true", "15656200:false", "3721:false"],
*/
          services: serviceSubscriptions.map(({recipientId,serviceId}) => serviceId+':'+serviceSubscriptions.some(({serviceId}) => recipientId === id)),
          
          /*not working logic here HELP!!!!!!!********/
          servicesDEV:[serviceSubscriptions.map((x) => x).reduce((acc, { recipientId, serviceId }) =>
      acc.set(recipientId,
        (acc.get(recipientId) ?? new Set).add(serviceId)), new Map)
    .entries()].map((serviceIds) => serviceIds.serviceId),
          /*****************/
          
          ...recipient,
          
        }

});

console.log(recipientObj)

Expected outcome of servicesDev key

  id: "666777",
  isSubscribed: true,
  jurisdiction: "AMER",
  lawfulBasis: "0",
  name: "David G",
  services: ["3218143:true", "8956799:true", "15656200:false", "3721:false"],
  servicesDEV: [3218143,8956799]

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

>Solution :

If I understood the question correctly, here is an attempt

let recipients = [
{"id":"666777","lawfulBasis":"0","jurisdiction":"AMER","name":"David G"},
{"id":"888999","lawfulBasis":"1","jurisdiction":"ASIA","name":"Mike A"},
{"id":"444555","lawfulBasis":"2","jurisdiction":"EUR","name":"John No Sub"}
];

let serviceSubscriptions =  [
{"recipientId":"666777","serviceId":"3218143"},
{"recipientId":"666777","serviceId":"8956799"},
{"recipientId":"888999","serviceId":"15656200"},
{"recipientId":"000000","serviceId":"3721"}
];

const result = recipients.map(recipient => {
  // Create an array of the recipient's subscription IDs
  const subscriptionIds = serviceSubscriptions
    .filter(subscription => subscription.recipientId === recipient.id)
    .map(subscription => subscription.serviceId);

  return {
    ...recipient,
    subscriptions: {
      services: subscriptionIds,
      servicesDEV: [`subs:${JSON.stringify(subscriptionIds)}`]
    }
  };
});

console.log(result);

EDIT
check the snippet below to have services as the main key to the object
https://jsfiddle.net/a0d31b2o/

Edited answer

// Use the reduce() method to create the recipientServices object that maps each recipient ID to an array of their service subscriptions
let recipientServices = serviceSubscriptions.reduce((services, subscription) => {
  // If the recipient has not been added to the services object yet, create an entry for them
  if (!services[subscription.recipientId]) {
    services[subscription.recipientId] = [];
  }

  // Add the service to the array of services for the current recipient
  services[subscription.recipientId].push(subscription.serviceId);

  return services;
}, {});

// Use the reduce() method to create the recipient objects and add them to an array to store the result
let resultArray = recipients.reduce((result, recipient) => {
  // Create a new object for the current recipient
  let recipientObject = {
    id: recipient.id,
    isSubscribed: false,
    jurisdiction: recipient.jurisdiction,
    lawfulBasis: recipient.lawfulBasis,
    name: recipient.name,
    services: [],
    servicesDEV: []
  };

  // If the recipient is in the recipientServices object, set isSubscribed to true and add their services to the services array
  if (recipientServices[recipient.id]) {
    recipientObject.isSubscribed = true;
    recipientObject.services = recipientServices[recipient.id].map(serviceId => serviceId + ":true");
    recipientObject.servicesDEV = recipientServices[recipient.id];
  }

  // Add the new object to the result array
  result.push(recipientObject);

  return result;
}, []);

console.log(resultArray)
Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading