Использование одной строки и разбиение ее на .
может привести к поломке, если у ваших объектов есть точки в ключах, такие как {'first.name':'John'}
, поэтому, вероятно, лучше вместо этого предоставить массив со строками / целыми числами.
Вотреализация lodash get с той разницей, что он принимает путь только как строку:
var data = [
{
children: [
{
children: [{ name: 'got it' }],
},
],
},
null,
];
const get = (object, path = '', defaultValue) => {
const recur = (object, path, defaultValue) => {
if (typeof object !== 'object') {
return defaultValue;
}
if (path.length === 0) {
return object;
}
if (object !== null && path[0] in object) {
return recur(
object[path[0]],
path.slice(1),
defaultValue,
);
}
return defaultValue;
};
return recur(object, path.split('.'), defaultValue);
};
console.log(get(undefined, '', 'Hello World'));//defaults to hello world
console.log(get(data, 'does.not.exist', 'Hello World'));//defaults to hello world
console.log(get(data, '1', 'Hello World'));//will be null (data[0] is null)
console.log(get(data, '1.anything', 'Hello World'));//defaults to hello world
console.log(//gets item data[0].children[0].children[0]
get(data, '0.children.0.children.0', 'Hello World'),
);