I have some huge array structures and I have to traverse them and read some branches and sometimes have to modify some leaves.
The array keys I want to use are passed as an array themselves and generated somewhere else completely separated.
This is my current solution:
var arraytraverse = function(array, keys, value = undefined) {
let pointer = array;
for (let i = 0; i < keys.length; i++) {
if (!keys.hasOwnProperty(i)) {
continue;
}
if (i === keys.length - 1 && value !== undefined) {
pointer[keys[i]] = value;
}
if (!pointer.hasOwnProperty(keys[i])) {
return null;
}
pointer = pointer[keys[i]];
}
return pointer;
}
This is my jasmine test:
var data = {
a: {
b: {
c: {
foo: 'bar',
},
},
},
};
describe('arraytraverse', () => {
it('should be transparent', () => {
let res = arraytraverse(data, []);
expect(res).toEqual(data);
});
it('should be traversing', () => {
let res = arraytraverse(data, ['a', 'b']);
expect(res).toEqual(data.a.b);
});
it('should handle non existing', () => {
let res = arraytraverse(data, ['a', 'miss']);
expect(res).toBeNull();
});
it('should change by reference', () => {
arraytraverse(data, ['a', 'b', 'c', 'foo'], 'baz');
let res = arraytraverse(data, ['a', 'b', 'c', 'foo'], 'baz');
expect(res).toBe('baz');
expect(data.a.b.c.foo).toBe('baz');
});
});
Everything is fine.
I just want to ask some more experienced of you if there is a way to improve my code.
Or are there better ways of doing it I am not aware of?
And no, I do not want to rely on any vendor. I want to learn. ;)
TIA!
edit: I added some changes to it: pastebin.com/UkUUSAZX