I'm having trouble using RecursiveIterator.
Basically, I need to iterate over a graph of objects to see what properties mays have been modified to be able to insert an history in a database...
So, I wrote the following Typescript code to play with in VS Code:
import RecursiveIterator = require("recursive-iterator");
const old = {
vehicleId: 1,
vehicleName: "Ol",
modifiedProperties: [],
device: {
deviceId: 12,
hardwareId: "12345",
modifiedProperties: [],
},
};
const n = {
vehicleId: 1,
vehicleName: "Ol2",
modifiedProperties: ["vehicleName"],
device: {
deviceId: 12,
hardwareId: "54321",
modifiedProperties: ["hardwareId"],
},
};
console.log("ouf");
var iteratorOnDeepClone = new RecursiveIterator(old, undefined, true);
var iteratorOnModifiedObject = new RecursiveIterator(n, undefined, true);
while (true) {
let { value: valueOnModifiedObject, done: doneOnModifiedObject } =
iteratorOnModifiedObject.next();
let { value: valueOnDeepClone /*, done: doneOnDeepClone*/ } =
iteratorOnDeepClone.next();
if (valueOnDeepClone == undefined) {
console.error("have a kitkat");
}
let {
parent: parentOnDeepClone,
node: nodeOnDeepClone,
key: keyOnDeepClone,
path: pathOnDeepClone,
deep: deepOnDeepClone,
} = valueOnDeepClone;
let {
parent: parentOnModifiedObject,
node: nodeOnModifiedObject,
key: keyOnModifiedObject,
path: pathOnModifiedObject,
deep: deepOnModifiedObject,
} = valueOnModifiedObject;
if (nodeOnModifiedObject.modifiedProperties != undefined) {
for (var prop of nodeOnModifiedObject.modifiedProperties) {
const oldValue: any = nodeOnDeepClone[prop];
console.log(prop, oldValue);
}
}
if (doneOnModifiedObject) {
console.log("done!");
break;
}
}
Right now it fails (on line 41) because a some point the iteratorOnDeepClone.next() returned object is invalid:
Exception has occurred: TypeError: Cannot destructure property 'parent' of 'valueOnDeepClone' as it is undefined.
at Object.<anonymous> (d:\temp\sandbox\out\iterator_sample.js:33:19)
at Module._compile (internal/modules/cjs/loader.js:1137:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1157:10)
at Module.load (internal/modules/cjs/loader.js:985:32)
at Function.Module._load (internal/modules/cjs/loader.js:878:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
at internal/main/run_main_module.js:17:47
package.json
{
"name": "playground",
"version": "0.0.1",
"private": true,
"dependencies": {
"recursive-iterator": "^3.3.0"
},
"devDependencies": {
"ts-node": "^10.2.1",
"tsconfig-paths": "^3.11.0",
"typescript": "4.2.4"
}
}
tsconfig.json
{
"compilerOptions": {
"target": "es6",
"module": "commonjs",
"outDir": "out",
"sourceMap": true
}
}
launch.json
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "pwa-node",
"request": "launch",
"name": "Launch Program",
"skipFiles": [
"<node_internals>/**"
],
"program": "${workspaceFolder}/iterator_sample.ts",
"preLaunchTask": "tsc: build - tsconfig.json",
"outFiles": [
"${workspaceFolder}/out/**/*.js"
]
}
]
}
EDIT 1: Found he breaks and stopped the train. The problem lies with te modifiedProperties array that is considered as an object when not empty. So the iterators are desynchronized.