Allow to access child by id as if it was the parent key name, eg:
obj = {
items: [
{ id:'foo', value:3 },
{ id:'bar', value:42 },
],
}
extractValue(obj, 'items.1.value') // 42
extractValue(obj, 'items.bar.value') // 42
Define a default value
:
No more default value
option, null coalescing does the job!
extractValue(obj, 'any.path.that.will.fail') ?? myDefaultValue
Allow to access child by testing the value of a prop, eg:
obj = {
items: [
{ id:'foo', value:3 },
{ id:'bar', value:42 },
],
}
// note the '.' before '[id=foo]'
extractValue(obj, 'items.[id=foo].value') // 3
extractValue(obj, 'items.[value > 40].id') // "bar"
Allow to access child by id as if it was the parent key name, eg:
obj = {
items: [
{ id:'foo', value:3 },
{ id:'bar', value:42 },
],
}
extractValue(obj, 'items.foo.value') // 3
AutoKeys are automatically extracted from any node.
This allows different alternative values for as same path, eg:
obj = {
foo: {
dev: { value:'foooo!!!' },
uat: { value:'foo' },
prod: { value:'Foo.' },
},
bar: {
dev: 'baaar!!!',
uat: 'bar',
prod: 'Bar.',
},
}
extractValue(obj, 'foo.value', null, ['dev']) // 'foooo!!!'
extractValue(obj, 'bar', null, ['prod']) // 'Bar!!!'
AutoKeys does not bypass (anymore) existing keys:
const autoKeys = ['value']
extractValue({ foo:{ value:'bar', meta:3 } }, 'foo', autoKeys) // 'bar'
extractValue({ foo:{ value:'bar', meta:3 } }, 'foo.meta', autoKeys) // 3
With two autoKeys:
obj = {
article: {
mobile: {
dev: { title:'TBD' },
prod: { title:'Concise title.' },
},
desktop: {
dev: { title:'TBD' },
prod: { title:'A exhaustive, precise title about something.' },
},
},
}
extractValue(obj, 'article.title', null, ['prod', 'mobile']) // 'Concise title.'
Intensive recursive test:
obj = {
dev: { foo: { mobile: { dev: { dev: { mobile: { bar:{ dev: { mobile:'lol' }}}}}}}}
}
extractValue(obj, 'foo.bar', null, ['dev', 'mobile']) // 'lol'
sometimes we may want to retrieve the object, not the inner value, 'skipLastAutoKey'
allow to get it:
data = {
value: {
foo: {
value: {
bar: {
value:'qux',
},
},
},
},
}
ObjectUtils.extractValue(data, 'foo.bar', { autoKeys:['value'] }) // "qux"
ObjectUtils.extractValue(data, 'foo.bar', { autoKeys:['value'], skipLastAutoKey:true }) // {value: "qux"}
sometimes autoReference need to be searched from another node than the current node:
data = {
someInfo: 'foo is cool',
someNode: {
someNestedNode: {
value: '$(someInfo)',
},
},
}
extractValue(data.someNode.someNestedNode, 'value') // undefined
extractValue(data.someNode.someNestedNode, 'value', { rootNodeForAutoReference:data }) // "foo is cool"
are ignored, eg:
obj = {
foo: {
bar: {
qux: 42,
}
}
}
extractValue(obj, `foo
.bar
.qux`) // 42