Dans le processus de développement habituel, vous rencontrerez toujours
obj.a.b.c
une méthode similaire à la transmission pour obtenir la valeur contenue dans la couche profonde de l'objet. Cependant, si vous rencontrez ou sonta
, , , et d'autres types de données , une erreur apparaîtra. De plus, nous obtenons souvent des données de la base de données via le backend.Dans ce lien, il est impossible de dire qu'une situation similaire se produira un jour pendant le processus de transfert. Ci-dessous, nous écrivons la méthode à la main pour éviter que cela ne se produise.b
c
null
undefined
1
'2'
true
get
1. get
Fonction
let get = function (obj, path, defaultValue) {
// 将路径拆分成数组
let pathArr = path.split('.');
// 默认是传入的值
let currentValue = obj;
for (let i = 1; i < pathArr.length; i++) {
// 边界1:如果上一次值不是对象,或者为null,或者为undefined,直接返回默认值
if (typeof currentValue !== 'object' || currentValue === null || currentValue === undefined) {
return defaultValue;
}
// 当前路径
let path = pathArr[i]
// 当前key的数组
let keys = Object.keys(currentValue)
// 边界2:当前路径不在上一次值的keys中,直接返回默认值
if (!keys.includes(path)) {
return defaultValue;
}
// 获取当前路径下的值
currentValue = currentValue[path];
}
return currentValue;
}
复制代码
2. Cas d'essai
// 测试1
let obj1 = {
a: [{
b: {
c: 3
}
}]
}
console.log(get(obj1, 'obj1.a.0.b.c', -1)) // 3
console.log(get(obj1, 'obj1.a.0.d.c', -1)) // -1
console.log(get(obj1, 'obj1.a.0.b.c.f', -1)) // -1
// 测试2
let obj2 = {
a: {
b: null
}
}
console.log(get(obj2, 'obj2.a.b', -1)) // null
console.log(get(obj2, 'obj2.a.b.c', -1)) // -1
// 测试3
let obj3 = {
a: {
b: undefined
}
}
console.log(get(obj3, 'obj3.a.b', -1)) // undefined
console.log(get(obj3, 'obj3.a.b.c', -1)) // -1
复制代码