Lodash _.get enhanced with * wildcard
A Lodash mixin which can return an array of strings out of nested object arrays
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
JavaScript
let object = {
suppliers: [{
id: 1,
name: 'foo',
phone: {
id: 1,
prefix: '+49',
number: '123456789',
},
addresses: [{
id: 1,
name: 'lorem',
street: {
name: 'fakerstreet',
nr: 23,
}
},
{
id: 2,
name: 'ipsum',
}
]
},
{
id: 2,
name: 'bar',
addresses: [{
id: 1,
name: 'test',
},
{
id: 2,
name: '123',
street: {
name: 'lorem-ipsum street',
nr: 42,
}
}
]
},
],
}
let collection = [];
_.mixin({
'enhancedGet': function(object, path, defaultValue) {
let result, parts = path.split('*');
if (parts.length <= 1) {
result = _.get(object, path, defaultValue);
} else {
path = _.trim(parts.shift(), '.');
let remainingPath = _.trim(parts.join('*'), '.');
let data = object
if (path) data = _.get(object, path)
if (data && data.length) {
data.forEach(item => {
const nextLevelResult = _.enhancedGet(item, remainingPath, defaultValue);
if (parts.length == 1 && ! _.isEmpty(nextLevelResult)) collection.push(nextLevelResult);
})
}
result = collection;
}
return result;
}
});
const result = _.enhancedGet(object, 'suppliers.*.addresses.*.street.name')
console.log(result)