Как разбить пунктирную строку и извлечь данные из объекта по нотации? - PullRequest
0 голосов
/ 24 мая 2018

В настоящее время я делаю такой подход:

var obj = {
  sender: {
    name: "tech"
  }
}


var str = "sender.name".split('.');

console.log( obj[str[0]][str[1]] ); //getting update as 'Tech'

В приведенном выше примере я использую obj[str[0]][str[1]] всего за 2 шага, это прекрасно работает.В случае, если я получил длинный родительский и дочерний узлы, этот подход не сработает.

Вместо этого есть ли правильный динамический способ сделать это?

Ответы [ 4 ]

0 голосов
/ 24 мая 2018

Вы должны искать такие библиотеки, как "https://lodash.com/"

https://lodash.com/docs/4.17.10

Использовать _.get: https://lodash.com/docs/4.17.10#get

Вы можете просто написать _.get(obj, 'sender.name', 'default') и вы получите значение, как вы ожидаете

0 голосов
/ 24 мая 2018

Вы можете использовать array#reduce для навигации по каждой клавише.

var obj = { sender: { name: "tech" } };
var str = "sender.name".split('.').reduce((r,k) => r[k],obj);
console.log(str);
0 голосов
/ 24 мая 2018

Вы можете разбить строку и уменьшить путь для результата.Функция использует объект по умолчанию для отсутствующих или не заданных свойств.

function getValue(object, path) {
    return path
        .split('.')
        .reduce(function (o, k) { return (o || {})[k]; }, object);
}

var obj = { sender: { name: "tech" } },
    str = "sender.name";
        
console.log(getValue(obj, str));
0 голосов
/ 24 мая 2018

Вы можете использовать reduce:

var obj = {
  foo: {
    bar: {
      baz: {
        sender: {
          name: "tech"
        }
      }
    }
  }
}


const props = "foo.bar.baz.sender.name".split('.');
const val = props.reduce((currObj, prop) => currObj[prop], obj);
console.log(val);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...