I have a situation where I have an object where some of the properties contain arrays like so:
current: {
primary: [ [Object] ],
secondary: [ [Object] ],
tertiary: [],
quaternary: [],
quinary: [],
senary: [],
septenary: [],
octonary: [],
nonary: [],
denary: []
},
To find the correct one, I could do something not very elegant, like this:
getLastActive = (current) => {
let lastActive;
if(current.primary[0] && current.primary[0].coverage.purchaser.name !== 'customer') {
lastActive = current.primary[0];
} else if(current.secondary[0] && current.secondary[0].coverage.purchaser.name !== 'customer') {
lastActive = current.secondary[0];
} else if(current.tertiary[0] && current.tertiary[0].coverage.purchaser.name !== 'customer') {
lastActive = current.tertiary[0];
} else if(current.quaternary[0] && current.quaternary[0].coverage.purchaser.name !== 'customer') {
lastActive = current.quaternary[0];
} else if(current.senary[0] && current.senary[0].coverage.purchaser.name !== 'customer') {
lastActive = current.senary[0];
} else if(current.septenary[0] && current.septenary[0].coverage.purchaser.name !== 'customer') {
lastActive = current.septenary[0];
} else if(current.octonary[0] && current.octonary[0].coverage.purchaser.name !== 'customer') {
lastActive = current.octonary[0];
} else if(current.nonary[0] && current.nonary[0].coverage.purchaser.name !== 'customer') {
lastActive = current.nonary[0];
} else if(current.denary[0] && current.denary[0].coverage.purchaser.name !== 'customer') {
lastActive = current.denary[0];
}
return lastActive;
}
const enums = {
ORDER: {
1: "primary",
2: "secondary",
3: "tertiary",
4: "quaternary",
5: "quinary",
6: "senary",
7: "septenary",
8: "octonary",
9: "nonary",
10: "denary",
},
};
While that works, what I'd prefer to do is something more succinct like this:
getLastActive = (current) => {
let lastActive;
let sequence = enums.ORDER['some value']; // Not sure what goes here
if(current[enums.ORDER[sequence]][0].coverage.purchaser.name !== 'customer') {
lastActiveCommercial = current[enums.ORDER[sequence]][0];
}
return lastActive;
}
I've seen this done elsewhere. However, what I'm unclear on is what I can put in this line, to get the right array reference:
let sequence = enums.ORDER['some value']; // Not sure what goes here
To be clear, I know that the data I want is the first property of primary
, secondary
, tertiary
, etc., that is not an empty array, and where coverage.purchaser.name !== 'customer'
.
What can I use to pull this out based on the data above?
CodePudding user response:
You could use a simple array as order representation. It can be created from the enum definition using Object.values(enums.ORDER)
.
const current = {
primary: [{
coverage: {
purchaser: {
name: 'customer'
}
}
}],
secondary: [{
coverage: {
purchaser: {
name: 'purchaser'
}
}
}],
tertiary: [],
quaternary: [],
quinary: [],
senary: [],
septenary: [],
octonary: [],
nonary: [],
denary: []
};
const enums = {
ORDER: {
1: "primary",
2: "secondary",
3: "tertiary",
4: "quaternary",
5: "quinary",
6: "senary",
7: "septenary",
8: "octonary",
9: "nonary",
10: "denary",
}
};
function getLastActive(current) {
let lastActive;
const ORDER = Object.values(enums.ORDER);
for (const order of ORDER) {
const item = current[order][0];
if (item && item.coverage.purchaser.name !== "customer") {
lastActive = item;
break;
}
}
return lastActive;
}
console.log(JSON.stringify(getLastActive(current), null, 2));