Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Получить значение из объекта по указанному в виде строки пути (https://javascript.ru/forum/misc/77892-poluchit-znachenie-iz-obekta-po-ukazannomu-v-vide-stroki-puti.html)

ULTIMITE 28.06.2019 14:41

Получить значение из объекта по указанному в виде строки пути
 
Собственно, есть путь (может быть разной вложенности), указанный в формате строки, например такой:
let path = 'array[elementNumber].array2[elementNumber2].objectName.propertyName';


Задача, получить значение, указанное по указанному пути, не применяя eval. Пробовал через split('.') и reduce(), но если в пути указан элемент массива - способ не работает. Как можно решить задачу?

Nexus 28.06.2019 16:11

Напишите какой в итоге должен получиться путь?
Какой-то кривой путь у вас...

ULTIMITE 28.06.2019 17:55

Цитата:

Сообщение от Nexus
Напишите какой в итоге должен получиться путь?
Какой-то кривой путь у вас...

В том то и дело, что путь может быть в теории любым, и надо как-то по нему извлекать значения. Например, написать для этого функцию, в неё помимо строки пути передавать объект, и уже от него исходить, пытаясь по этому пути что-нибудь достать. Типа:
const extractValueByPath = (path, obj) => {
   // Код, извлекающий значение
}

destus 28.06.2019 21:18

https://lodash.com/docs/4.17.11#get

ULTIMITE 01.07.2019 18:55

destus,
А без сторонних библиотек?

рони 01.07.2019 19:39

Цитата:

Сообщение от ULTIMITE
А без сторонних библиотек?

let obj = {array : [0,0, {array2 : [1,2,{objectName : {propertyName : "test" }}]}]}
let path = 'array[2].array2[2].objectName.propertyName';
let test = path.split(".").reduce((ob, key, index) => {
[key, index] = key.match(/[^\[\]]+/g);
return (index === void 0) ? ob[key] : ob[key][index]
}, obj)
alert(test);

Aetae 02.07.2019 01:11

ULTIMITE, идёте на гитхаб и смотрите как это сделано в lodash или какой иной библиотеке. Это лучший способ избежать внезапных граблей.
Например вариант рони завалится на таком: object["bracketsIn[Name]"].


Часовой пояс GMT +3, время: 17:20.