如何识别嵌套对象中的键和筛选字符串



在会话中创建和设置的动态JSON值,如下所示。每个TestDataUsedDetail对象都有Work对象,Work对象包含workIdworkName。如果workId包含字符串-old-,则requiredWork值应设置为oldWork如果workId不包括字符串-old-,则requiredWork应为newWork。如果两者混合,则requiredWork应为All。我尝试了以下操作,但不起作用。如何有效地做到这一点?

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";

预期结果:workRequired=";所有";

你是这个意思吗?

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)

或者这个:

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)

我不完全理解你的需求。您有一个用于工作详细信息的数组,该数组中的所有项可能都有不同的密钥信息。因此,我认为,在确定对新工作或旧工作的需求时,需要对该数组中的每个记录都这样做。但如果你不介意的话,你的问题的答案如下。

let 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 = workData.TestDataUsedDetail;
let workRequired = "";
let isOldWork = false;
let isNewWork = false;
workDetails.forEach(detail => {
if(detail.Work) {
if(detail.Work.hasOwnProperty("workId")) {
if(detail.Work.workId.indexOf("-old-") > -1) {
isOldWork = true;
} else {
isNewWork = true;
}
}
}
});
if(isOldWork && isNewWork) {
workRequired = "All";
} else if(isOldWork && !isNewWork) {
workRequired = "Old Work";
} else if(!isOldWork && isNewWork) {
workRequired = "New Work";
}
console.log(workRequired);

使用reduce方法应该可以为您提供更干净的代码。您只需要迭代一次。

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 }

var result = workData.TestDataUsedDetail.reduce((acc, detail) => {
acc.newWork = acc.newWork || detail.Work.workId.includes('-old-');
acc.oldWork = acc.oldWork || !detail.Work.workId.includes('-old-');
return acc;
}, { newWork: false, oldWork: false });
if (result.newWork && result.oldWork) workRequired = "All";
else if (result.newWork) workRequired = "New";
else if (result.oldWork) workRequired = "Old";
console.log(workRequired);

最新更新