1

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;
}
2
  • How do you define saved and visibility properties if it doesn't exist in data2? Commented Aug 27, 2020 at 5:53
  • @OsmanOmar Both data are from backend different tables. I just want modify data1 with only processes that have id. Commented Aug 27, 2020 at 5:58

2 Answers 2

3

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());

Sign up to request clarification or add additional context in comments.

Comments

0

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);
  }
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.