Pallavi
Pallavi

Reputation: 506

How to update a complex json object based on array of objects

I have 2 data structures as shown below

data1 :

{
  purchaceOrder: [{
      name: "Purchase Order",
      version: 1,
      description: "purchase order process",
      saved: true,
      visibility: true
    },
    {
      name: "Purchase Order",
      version: 2,
      description: "purchase order process",
      saved: false,
      visibility: true
    }
  ],
  requestOrder: [{
      name: "Request Order",
      version: 1,
      description: "request order process",
      saved: true,
      visibility: true
    },
    {
      name: "Request Order",
      version: 2,
      description: "request order process",
      saved: false,
      visibility: true
    }
  ],
  cancelOrder: [{
    name: "Cancel Order",
    version: 1,
    description: "cancel order process",
    saved: false,
    visibility: false
  }]
}

data2:

[
  {
    id: "dwffrgefg68964",
    name: "Purchase Order",
    version: 1
  },
  {
    id: "emffrgefg68964",
    name: "Purchase Order",
    version: 2
  },
  {
    id: "iuffrgefg68964",
    name: "request Order",
    version: 1
  }
]
  

I want to filter data1 based on name, add id from data2 to each object in data1 and remove the entire object/ empty array in data1 if the process name is not found in data2 as given below

Final result:

{
  purchaceOrder: [{
      id: "dwffrgefg68964"
      name: "Purchase Order",
      version: 1,
      description: "purchase order process",
      saved: true,
      visibility: true
    },
    {
      id: "emffrgefg68964"
      name: "Purchase Order",
      version: 2,
      description: "purchase order process",
      saved: false,
      visibility: true
    }
  ],
  requestOrder: [{
    id: "iuffrgefg68964"
    name: "Request Order",
    version: 1,
    description: "request order process",
    saved: true,
    visibility: true
  }]
}

I tried various solutions but couldn't get the expected result. This is what I have:

getAllProcess(){
for (let key in data1) {
  var temp1 = data1[key];
  for (let i = 0; i < temp1.length; i++) {
      const reqModel = data2.find(process=> process.name === temp1[i].name&& process.version === temp1[i].version);
    if(reqModel){
      temp1[i].id=reqModel.id;
        data1[key][i]=temp1[i];
    }
    }}
    return data1;
}

Upvotes: 1

Views: 141

Answers (2)

Nick
Nick

Reputation: 147256

Your code is close; you just need to delete entries in data1 which have no corresponding value in data2:

let data1 = {
  purchaseOrder: [{
      name: "Purchase Order",
      version: 1,
      description: "purchase order process",
      saved: true,
      visibility: true
    },
    {
      name: "Purchase Order",
      version: 2,
      description: "purchase order process",
      saved: false,
      visibility: true
    }
  ],
  requestOrder: [{
      name: "Request Order",
      version: 1,
      description: "request order process",
      saved: true,
      visibility: true
    },
    {
      name: "Request Order",
      version: 2,
      description: "request order process",
      saved: false,
      visibility: true
    }
  ],
  cancelOrder: [{
    name: "Cancel Order",
    version: 1,
    description: "cancel order process",
    saved: false,
    visibility: false
  }]
};

let data2 = [{
    id: "dwffrgefg68964",
    name: "Purchase Order",
    version: 1
  },
  {
    id: "emffrgefg68964",
    name: "Purchase Order",
    version: 2
  },
  {
    id: "iuffrgefg68964",
    name: "Request Order",
    version: 1
  }
];

function getAllProcess() {
  for (let key in data1) {
    var temp1 = data1[key];
    for (let i = temp1.length - 1; i >= 0; i--) {
      const reqModel = data2.find(process => process.name === temp1[i].name && process.version === temp1[i].version);
      if (reqModel) {
        temp1[i].id = reqModel.id;
        data1[key][i] = temp1[i];
      } else {
        data1[key].splice(i, 1);
      }
    }
    if (!data1[key].length) {
      delete data1[key];
    }
  }
  return data1;
}

console.log(getAllProcess());

Upvotes: 3

Osman Omar
Osman Omar

Reputation: 453

I made certain algorithm for you. It's creating data1 with empty arrays, then pushing data2 items by their name properties.

const data1 = {
  requestOrder: [],
  purchaseOrder: [],
  cancelOrder: []
};
const data2 = ...;
data2.forEach((d) => {
  if (d.name == 'Request Order') {
    data1.requestOrder.push(d);
  } else if (d.name == 'Purcase Order') {
    data1.purchaseOrder.push(d);
  } else {
    data1.cancelOrder.push(d);
  }
});

Upvotes: 0

Related Questions