У меня есть несколько огромных структур массива, и я должен пройти их и прочитать некоторые ветви, а иногда мне нужно изменить некоторые листья.
Ключи массива, которые я хочу использовать, передаются в виде самого массива и генерируются где-то еще полностью разделенными.
Это мое текущее решение:
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;
}
Это моеЖасмин тест:
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');
});
});
Все хорошо.
Я просто хочу спросить некоторых более опытных из вас, есть ли способ улучшить мой код.
Или есть ли лучшие способы сделать это, о которых я не знаю?
И нет, я не хочу полагаться на какого-либо поставщика.Я хочу учиться.;)
TIA!
edit: я добавил некоторые изменения: pastebin.com/UkUUSAZX