Regex: разделить строку пути обозначения объекта с поддержкой массива - PullRequest
0 голосов
/ 29 мая 2019

У меня есть рекурсивная функция, чтобы пройти через объект и получить то, что нужно, используя строку пути, такую ​​как jsonObj.object.item.value.Идея состоит в том, чтобы как-то обновить его для поддержки массивов.

const getValue = function(pathVar, obj) {
  obj = obj || x;
  // get very first node and the rest
  let [node, restNodes] = pathVar.split(/\.(.+)/, 2)
  // get interim object
  ret = obj[node];
  if(ret === undefined) return undefined;
  // pass rest of the nodes further with interim object
  if(restNodes) return getValue(restNodes, ret);
  return ret;
};

Прямо сейчас на каждой итерации простое регулярное выражение разбивает строку пути, такую ​​как jsonObj.object.item.value, на jsonObj и object.item.value

идеяэто добавить поддержку массива здесь, чтобы я мог делать преобразования, такие как

car.engine.something => car и engine.somethingwheels[2].material.name => wheels и [2].material.name[2].material.name => 2 и material.namecar.wheels[4] => car и wheels[4]

Есть идеи как это сделать?

1 Ответ

0 голосов
/ 29 мая 2019

Вы можете использовать eval , который просто оценит выражение.Что касается функционального подхода, используйте следующее.

function getValue(path, obj) {
    obj = obj || self; // self is the global window variable
    if( !path )
        return obj;

    let pattern = /(?:\["?)?(\w+)(?:\.|"?])?(.*)/i;

    let [ full, property, rest ] = path.match(pattern);
    return getValue( rest, obj[ property ] );
}

self.obj = { foo: [ 2, {bar: "baz"} ] };
console.log(getValue('obj.foo[1]["bar"]')) // 'baz'

Шаблон использует четыре группы.Первый не захватывает и ожидает возможное [", это поможет сопоставить свойства массива или объекта.Затем мы ожидаем серию буквенно-цифровых символов, которые мы фиксируем.Затем другая группа без захвата либо закроет "], либо совпадет с ..Наконец, мы фиксируем остаток для использования в следующем вызове.

Снова eval способен на все это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...