js 根据原始数据对值进行深度覆盖,深度混入

需求,如果一个字段的值是undefined则大多数情况下会被抛出异常,如何防止数据出现undefined?

解决思路

  1. 创建一个数据模型
  2. 让获取到的数据全部按照数据模型进行填充,模型内未定义的值则舍弃
  3. 模型内已定义的值,但数据未定义则按照模型的值填充

总结

按照上述思路则可以避免出现数据未定义的情况

上代码

/* 
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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

行囊电子商务

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值