Стандарт де-факто для простого 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
является действительным или нет.