[Fixed] How to identify the key and filter string in nested object

Issue

Dynamic JSON value created and set in session similar to below. Each TestDataUsedDetail object has Work object and Work Object contains workId and workName.
If workId include string -old- then requiredWork value should be set as oldWork
If workId does not includes the string -old- then requiredWork should be newWork.
If both are mixed then requiredWork should be All.
I tried the following but it is not working. How to do this effectively?

const workData = {
  "TestData": "NewData",
  "TestDataDetail": {
    "TestData": "OldData",
    "address": {
      "add1": 207,
      "add2": "east Stret"
    },
    "passcode": null
  },
  "TestDataUsedDetail": [{
      "Work": {
        "workId": "work-data-new",
        "workName": "Brand"
      }
    },
    {
      "Work": {
        "workId": "work-old-data",
        "workName": "Work Data Used"
      }
    },
    {
      "Work": {
        "workId": "work-new-progress",
        "workName": null
      }
    },
    {
      "Work": {
        "workId": "work-old-data2",
        "workName": null
      }
    },
    {
      "Work": {
        "workId": "work-old-progress",
        "workName": "Work Data not used"
      }
    },
    {
      "Work": {
        "workId": "work-pending-scheduled",
        "workName": null
      }
    }
  ],
  "WorkInfo": [

  ],
  "Workid": null
}



let workDetails = [];
let work = [];
var workRequired, workNew, oldWork;
workData.TestDataUsedDetail.forEach(detail => {
  workDetails = workData.TestDataUsedDetail;
  for (const key in workDetails) {
    if (workDetails.hasOwnProperty(key)) {
      var element = workDetails[key];
      if (element.Work.workId.includes('-old-')) {
        workNew = true;
      } else {
        oldWork = true;
      }
    }
  }
});

if (workNew && oldWork) {
  workRequired = "All";
} else if (workNew) workRequired = "New";
else if (oldWork) workRequired = "old";

Expected Result:
workRequired = "All"

Solution

Do you mean this?

const workData = { "TestData": "NewData", "TestDataDetail": { "TestData": "OldData", "address": { "add1": 207, "add2": "east Stret" }, "passcode": null }, "TestDataUsedDetail": [{ "Work": { "workId": "work-data-new", "workName": "Brand" } }, { "Work": { "workId": "work-old-data", "workName": "Work Data Used" } }, { "Work": { "workId": "work-new-progress", "workName": null } }, { "Work": { "workId": "work-old-data2", "workName": null } }, { "Work": { "workId": "work-old-progress", "workName": "Work Data not used" } }, { "Work": { "workId": "work-pending-scheduled", "workName": null } } ], "WorkInfo": [ ], "Workid": null }



workData.TestDataUsedDetail.forEach(({Work}) => {
  Work.required = Work.workId.indexOf("-old-") !=-1 ? "oldWork " : "newWork "
  console.log(Work) 
})
console.log(workData)

Or this:

const workData = { "TestData": "NewData", "TestDataDetail": { "TestData": "OldData", "address": { "add1": 207, "add2": "east Stret" }, "passcode": null }, "TestDataUsedDetail": [{ "Work": { "workId": "work-data-new", "workName": "Brand" } }, { "Work": { "workId": "work-old-data", "workName": "Work Data Used" } }, { "Work": { "workId": "work-new-progress", "workName": null } }, { "Work": { "workId": "work-old-data2", "workName": null } }, { "Work": { "workId": "work-old-progress", "workName": "Work Data not used" } }, { "Work": { "workId": "work-pending-scheduled", "workName": null } } ], "WorkInfo": [ ], "Workid": null }

const reducedWork = workData.TestDataUsedDetail.reduce((acc, {Work}) => {
  acc[Work.workId.indexOf("-old-") != -1 ? "old" : "new"]++; 
  return acc;
}, {new: 0,old: 0});


let workRequired;
if (reducedWork.new > 0 && reducedWork.old > 0) workRequired = "all";
else workRequired = reducedWork.new > 0 ? "new" : "old"
console.log(workRequired)

Leave a Reply

(*) Required, Your email will not be published