I am trying to find the first occurrence of id from the nested data and if it is founds want to update which path it took to reach there with the index and move to the next iterations.
For Example:
let error = [
{
id: 1,
message: 'test1',
key: 'surname',
type:1,
path: [],
},
{
id: 1,
message: 'test12',
key: 'firstname',
type:2,
path: [],
},
{
id: 2,
message: 'test2',
key: 'surname',
type:2,
path: [],
},
];
//data
data = {
txn: [
{
actions: [
{
source: [
{
type: 1,
id: 1,
profile: {
firstname: 'data1',
},
},
],
cond: [
{
type: 2,
id: 1,
profile: {
firstname: 'data1',
surname: 'data2',
},
onb: [
{
type: 2,
id: 2,
profile: {
firstname: 'data21',
surname: 'data22',
},
},
],
},
],
},
],
},
],
};
When id=1 is found in the nested data and type 1 is matched at the source of the 0 indexes, I wanted to update the path with the ['txn',0,'actions',0,'source',0] and move to the next error object
when id:1 is found in the nested data and type 2 matched ['txn',0,'actions',0,'cond',0]
when id:2 is found in the nested data and type 2 matched ['txn',0,'actions',0,'cond',0,'onb',1]
so my output would be
error = [
{
id: 1,
message: 'test1',
key: 'surname',
type:1,
path: ['txn',0,'actions',0,'source',0],
},
{
id: 1,
message: 'test12',
key: 'firstname',
type:2,
path: ['txn',0,'actions',0,'cond',0],
},
{
id: 2,
message: 'test2',
key: 'surname',
type:2,
path: ['txn',0,'actions',0,'cond',0,'onb',1]
},
];
I tried the following code but two issues ,I am facing
- it is not updating the path
- it is not ending the loop properly.
Stackblitz:https://stackblitz.com/edit/js-nsebln?file=index.js
function findVal() {
error.forEach((ev) => {
let stop = false;
//console.log(ev)
//search for occurance of the id with type matching
//if matched update the value in the error
//move to the next error once first occurance found
for (let i = 0; i < data.txn.length; i++) {
let actiondata = data.txn[i].actions;
for (let j = 0; j < actiondata.length; j++) {
let sourcedata = actiondata[j].source;
for (let k = 0; k < sourcedata.length; k++) {
if (ev.id === sourcedata[k].id && sourcedata[k].type == ev.type) {
console.log('matched', i, j, k);
//matched
//update error object
ev.path.push('txn');
console.log(ev.path);
ev.path.push(i);
ev.path.push('actiondata');
ev.path.push(j);
ev.path.push('source');
ev.path.push(k);
stop = true;
}
if (stop) {
break;
}
}
//cond loop
let conddata = actiondata[j].cond;
for (let l = 0; l < conddata.length; l++) {
if (
ev.id === conddata[l].id &&
!stop &&
conddata[l].type == ev.type
) {
console.log('matched', i, j, l);
//matched
//update error object
ev.path.push('txn');
ev.path.push(i);
ev.path.push('actiondata');
ev.path.push(j);
ev.path.push('cond');
ev.path.push(l);
stop = true;
//onb loop
let onbdata = conddata[l].onb;
for (let m = 0; m < onbdata.length; m++) {
if (
ev.id === onbdata[m].id &&
!stop &&
onbdata[m].type === ev.type
) {
//matched
//update error object
ev.path.push('txn');
ev.path.push(i);
ev.path.push('actiondata');
ev.path.push(j);
ev.path.push('cond');
ev.path.push(l);
ev.path.push('onb');
ev.path.push(m);
stop = true;
}
if (stop) {
break;
}
}
}
if (stop) {
break;
}
}
if (stop) {
break;
}
}
if (stop) {
break;
}
}
console.log(ev);
});
}
findVal();
Can anyone please help me what I am doing wrong?