Могу ли я получить доступ к значению внутри некоторых вложенных объектов с помощью одной строки? - PullRequest
0 голосов
/ 07 декабря 2018

Мне было интересно, возможно ли получить доступ к значению внутри вложенного объекта с помощью только одной строки.Предположим, у меня есть такой объект:

skill: {
    skillDetails: {
        developerDetails: {
            developerName: "mr. developer"
        }
    }
}

Есть ли способ сделать что-то подобное, чтобы получить значение через "путь JSON": skill["skillDetails.developerDetails.developerName"]?

Я спрашиваю об этом потому, что пытаюсь передать объект key & в функцию (которую я не могу изменить), которая по существу возвращает object[key]

, не уверенную, возможно ли это, поэтому я подумал, чтоРебята, я бы попросил совета.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Нет «встроенного» метода, однако простое решение этого (которое не требует сторонней библиотеки) может быть достигнуто через split() и reduce() следующим образом:

var skill = {
  skillDetails: {
    developerDetails: {
      developerName: "mr. developer"
    }
  }
}

var path = "skillDetails.developerDetails.developerName";

var value = path
.split('.') // Split path into parts by '.'
.reduce((obj, part) => obj ? obj[part] : undefined, skill); // Extract value via reduction

console.log(value)
0 голосов
/ 07 декабря 2018

Стандарт де-факто для простого JS - это использование Array.reduce, поскольку, используя его аккумулятор, он позволяет вам «идти по пути» до тех пор, пока вы не доберетесь до значения, но часто это тот случай, когда напуть, который вы могли бы иметь функцию, игнорируется.Вот пример:

var obj = {
  foo: {
    bar: {
      fooBar: "BARFOO",
      foo: function() { return { c: 'BAR' }}
    }
  }
}

const get = (obj, path) => path.split('.').reduce((r,c) => {
  return r ? typeof r === 'function' ? r()[c] : r[c] : undefined
}, obj)

console.log(get(obj, 'foo.bar.fooBar'))
console.log(get(obj, 'foo.bar.foo'))
console.log(get(obj, 'foo.bar.foo.c'))

Как видите, если вы хотите получить фактическое значение foo.bar.foo.c, вам нужно пройти через функцию и выполнить ее ... теперь все это "пропущено"«Если вы хотите использовать _.result от lodash:

var obj = {
  foo: {
    bar: {
      fooBar: "BARFOO",
      foo: function() { return { c: 'BAR' }}
    }
  }
}

console.log(_.result(obj, 'foo.bar.fooBar'))
console.log(_.result(obj, 'foo.bar.foo'))
console.log(_.result(obj, 'foo.bar.foo.c'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

Что-то, что нужно держать посередине вместе с _.get, которое только получит ваши значения и не будет проходить через функции и _.has, который возвращает логическое значение, если path является действительным или нет.

0 голосов
/ 07 декабря 2018

К сожалению, быстрого встроенного метода для этого нет - вам понадобится вспомогательная функция.

lodash поддерживает это, используя _.get(obj, property).

Из документов:

var object = { 'a': [{ 'b': { 'c': 3 } }] };

_.get(object, 'a[0].b.c');
// → 3

_.get(object, ['a', '0', 'b', 'c']);
// → 3

_.get(object, 'a.b.c', 'default');
// → 'default'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...