纯原生仿ES6的Object.assign,实现深度合并对象
2016-06-20 19:21
162 查看
源码:
调用:
function isObj(x){ var type = typeof x; return x !== null && (type === 'object' || type === 'function'); } var hasOwnProperty = Object.prototype.hasOwnProperty; var propIsEnumerable = Object.prototype.propertyIsEnumerable; function toObject(val) { if (val === null || val === undefined) { throw new TypeError('Cannot convert undefined or null to object'); } return Object(val); } function assignKey(to, from, key) { var val = from[key]; if (val === undefined || val === null) { return; } if (hasOwnProperty.call(to, key)) { if (to[key] === undefined || to[key] === null) { throw new TypeError('Cannot convert undefined or null to object (' + key + ')'); } } if (!hasOwnProperty.call(to, key) || !isObj(val)) { to[key] = val; } else { to[key] = assign(Object(to[key]), from[key]); } } function assign(to, from) { if (to === from) { return to; } from = Object(from); for (var key in from) { if (hasOwnProperty.call(from, key)) { assignKey(to, from, key); } } if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(from); for (var i = 0; i < symbols.length; i++) { if (propIsEnumerable.call(from, symbols[i])) { assignKey(to, from, symbols[i]); } } } return to; } function deepAssign(target) { target = toObject(target); for (var s = 1; s < arguments.length; s++) { assign(target, arguments[s]); } return target; };
调用:
deepAssign({a: {b: 0}}, {a: {b: 1, c: 2}}, {a: {c: 3}}); //=> {a: {b: 1, c: 3}}
相关文章推荐
- JNIEnv类型和jobject类型的解释
- caffe遇到 ImportError: libcudart.so.7.5: cannot open shared object file: No such file or directory
- 深入浅出Mybatis系列(六)---objectFactory、plugins、mappers简介与配置
- WPF中的binding(八)- 使用ObjectDataProvider对象作为Binding的Source
- 第一篇 Object-C快速入门
- Objective-C实现一个基于数组下标[index]和字典[@"key"]的访问模式
- OpenGL Frame BufferObject(FBO)
- System.Types.hpp(77): E2029 'TObject' must be a previously defined class or struct
- 在ObjectARX的类定义中使用__declspec(dllimport)的危险
- 【Objective-C】02-Objective-C学习及iOS开发的准备
- Android Object
- iOS中使用JSPatch框架使Objective-C与JavaScript代码交互
- iOS复杂动画之抽丝剥茧(Objective-C & Swift)
- QT实现appendSheet(QAxObject的一种Add + Move的方法)
- 预编译加速编译(precompiled_header),指定临时文件生成目录,使项目文件夹更干净(MOC_DIR,RCC_DIR, UI_DIR, OBJECTS_DIR),#pragma execution_character_set("UTF-8")"这个命令是在编译时产生作用的,而不是运行时
- iOS Objective-C 笔记
- PHP中把stdClass Object转array(对象转数组)的几个方法
- [zz]Objective-C 内存管理精髓
- [zz]Objective-C 内存管理精髓
- [zz]Objective-C 内存管理精髓