Пытаюсь сделать helper функцию, в которую первым аргументом мы передаём обьект в котором исчем, а вторым это ключ которой должны получить. Проблема в том что не пойму как можно найти вложеный обьект если я захочу написать например c.x
const arr = {
a: 4,
b: 6,
c: { x: 9, y: 8 }
}
const x = keyObjectFinder(this.arr, 'c.x');
console.log('result is ' + x);
helper.js
export function keyObjectFinder(obj, value) {
if (typeof obj === 'object' && obj.constructor === Object) {
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
let x = obj[value];
return x;
}
}
}
}
Как вариант
function keyObjectFinder(obj, key) {
return key.split('.').reduce((subObject, subKey) => {
if (!subObject || subObject[subKey] === undefined) {
return undefined;
}
return subObject[subKey];
}, obj);
}
Проблема в том, что строковый ключ объекта может быть абсолютно любым:
{'c.x': 1, c: {x: 2}}
Поэтому нативный синтаксис не может поддерживать желаемое вами поведение.
Вам необходимо вручную разбивать путь к свойству и итеративно получать доступ ко всё более глубоким значениям:
const obj = {
a: 4,
b: 6,
c: {
x: 9,
y: 8
}
}
console.log('result is ', traverse(obj, 'c.x'));
////////////////////////
function traverse(obj, path, separator = '.') {
const parts = path.split(separator);
let res = obj;
for (const part of parts) {
if (res === undefined) break;
res = res[part];
}
return res;
}
А я бы использовал eval, чтобы не изобретать велосипед)
const arr = {
a: 4,
b: 6,
c: {
x: 9,
y: 8,
'key of bubu %$!#$#!!!?': [
15, {moo: 100500}
]
}
};
const x = keyObjectFinder( arr, `c['key of bubu %$!#$#!!!?'][1].moo`);
console.log('result is ' + x);
function keyObjectFinder(obj, value) {
if (typeof obj === 'object' && obj.constructor === Object) {
return eval( 'arr.' + value );
}
}
Ну и велосипед, без eval:
const arr = {
a: 4,
b: 6,
c: {
x: 9,
y: 8,
'key of bu.bu %$!#$#!!!?': [
15, {moo: 100500}
]
}
};
const x = keyObjectFinder( arr, "c['key of bu.bu %$!#$#!!!?'][1].moo");
console.log('result is ' + x);
function keyObjectFinder(obj, value) {
if (typeof obj === 'object' && obj.constructor === Object) {
let val = value.match(/^[^.[]+|\[.*?\]|[^.[]+/g);
console.log( val );
let x = obj;
for( let i = 0; i < val.length; i++ ){
let z = val[i].replace(/\[|\]/g, "").replace(/^['"`]|['"`]$/g,"");
x = x[ z ];
}
return x;
}
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Я тут практикуюсь в изучении JavaScript и столкнулся с одной ситуацией: Мне для нормального функционирования нужно число (к примеру 32) перевести...