需求,如果一个字段的值是undefined则大多数情况下会被抛出异常,如何防止数据出现undefined?
解决思路
- 创建一个数据模型
- 让获取到的数据全部按照数据模型进行填充,模型内未定义的值则舍弃
- 模型内已定义的值,但数据未定义则按照模型的值填充
总结
按照上述思路则可以避免出现数据未定义的情况
上代码
/*
mix(oldObj, newObj)
对象混合,返回新对象,将newObj的值按照oldObj的格式覆盖混合到新的对象并返回
示例
先判断 oldObj每项的值是否为预置类型,
_开头的字符串表示:非必须但强制类型,
如果是该类型则:字段可以不存在,但如果存在就必须符合格式,
_any, _object, Object, Array,
obj:{
name: "小明",
alt: 15,
hobbys: ["游泳", "爬山", "玩手机"],
address: "_any"
}
*/
// 这是一个按照模型进行深度混入的方法,更新于2022-8-2
let mix = (oldObj, newObj) => {
newObj = JSON.parse(JSON.stringify(newObj));
oldObj = JSON.parse(JSON.stringify(oldObj));
let result = {};
for (let key in oldObj) {
let o = oldObj[key]; // 初始值
let n = newObj[key]; // 新值
// 判断是不是预置类型 "_any","_object";
let pass = (() => {
return (o === "_any") || ((o === "_object") && (n.constructor == Object))
})();
if (pass) {
if (n) {
if (o === "_object") {
if (Object.keys(n).length) result[key] = newObj[key];
} else {
result[key] = newObj[key];
};
};
} else {
let n = (() => { // 新值
//新值类型等于原始值类型,且新值不为空
let condition = (typeof(oldObj) == typeof(newObj)) && (newObj[key] !== undefined);
if (condition) {
return newObj[key]; // 返回新值
};
return o; // 返回初始值
})();
// console.log("--", {key, o, n, "o.constructor": o.constructor, "o.constructor == Array": o.constructor == Array});
if (o !== null && o.constructor == Object) { // 如果初始值为对象类型 则继续遍历, null 无constructor属性
result[key] = mix(oldObj[key], n);
} else { // 如果初始值不为对象类型则返回新值
result[key] = n;
};
console.log("--", {
key,
o,
n
});
};
};
// console.log({result});
return result;
};
// 调用混入,
// 先定义一个模型
let model = {
name: "小明",
sex: "man"
};
// 加入现在获取到一条数据
let data = {
name: "小鹏"
};
// 获取结果
let result = mix(model, data);
console.log(result);
/* 结果
{
name: "小鹏",
sex: "man"
}
*/
更新代码
2022-7-14
2022-8-2