TypeScript里面没有现成的合并对象的方法,这里借鉴jQuery里的$.extend()方法。写了一个TypeScript的对象合并方法,使用方法和jQuery一样。

部分代码和jQuery代码略有不同,主要是判断元素是否为 数组 和 纯对象 的部分。jQuery中有方法可直接判断元素是否为数组($.isArray())和对象($.isPlainObject()),但是TpyeScript里面没有,这里按照jQuery的实现写了一下判断,大部分情况应该没问题,但不保证适用所有情况。感兴趣的话可以体会一下,遇到什么问题一起讨论一下。

   public class2type = {};
ngOnInit() {
this.getClass2type();
} /**
* 对象拷贝,参考$.extend()实现。首个参数为true时为深度拷贝,默认为false。
*
* @param {any} args
* @returns
* @memberof SharedService
*/
extend(...args) {
let options, name, src, srcType, copy, copyType, copyIsArray, clone,
target = args[0] || {},
i = 1,
length = args.length,
deep = false; if ( typeof target === 'boolean') {
deep = target;
target = args[i] || {};
i++;
}
if ( typeof target !== 'object' && typeof target !== 'function') {
target = {};
}
if ( i === length) {
target = this;
i--;
}
for ( ; i < length; i++ ) {
if ( (options = args[i]) !== null ) {
for ( name in options ) {
src = target[name];
copy = options[name];
// 若参数中字段的值就是目标参数,停止赋值,进行下一个字段的赋值
// 这是为了防止无限的循环嵌套
if ( target === copy ) {
continue;
}
srcType = this.isArray(src) ? 'array': typeof src;
// 不能用typeof判断一个数组是否为数组格式,例:typeof [] -> object。如需判断的话可用'[] instanceof Array'方法。
// copyType = typeof copy;
if ( deep && copy && ((copyIsArray = this.isArray(copy)) || typeof copy === 'object')) {
if ( copyIsArray ) {
copyIsArray = false;
clone = src && srcType === 'array' ? src : [];
} else {
clone = src && srcType === 'object' ? src: {};
}
target[name] = this.extend(deep, clone, copy);
} else if ( copy !== undefined ) {
target[name] = copy;
}
}
}
}
return target;
} public isArray = Array.isArray || function(obj) {
return this.type(obj) === 'array';
} private type(obj: object) {
if (obj === null) {
return obj + "";
}
return typeof obj === 'object' || typeof obj === 'function' ?
this.class2type[this.toString.call(obj)] || 'object' :
typeof obj;
} private getClass2type() {
'Boolean Number String Function Array Data RegExp Object Error'.split(' ').forEach(name => {
this.class2type['[object' + name + ']'] = name.toLowerCase();
});
} // 深度遍历,使用方法:
let newObj = this.extend(true, {}, objA, objB);

最新文章

  1. 微软发布正式版SQL Server 2016
  2. 从click事件理解DOM事件流
  3. Linux 文件描述符和重定向
  4. python 小程序练习
  5. kruskal算法-Pascal
  6. python 单元测试
  7. 在linux下使用百度ueditor编辑器上传图片
  8. Jhipster 学习(一)jhipster构建项目
  9. 关于Linux虚拟化技术KVM的科普 科普一(先用起来!)
  10. 5.CentOS7安装mariadb
  11. 【Django视图与网址进阶004】
  12. actionsheet(操作表)
  13. delphi 控件集
  14. shell 三剑客
  15. shiro 分布式缓存用户信息
  16. c#依参数自动生成控件
  17. EntityFramework系列:SQLite的CodeFrist和RowVersion
  18. Spark 保存文件 自定义分隔符
  19. django下载excel,使用django-excel插件
  20. LaTeX快速入门-蔡炎龙

热门文章

  1. IE滚动条
  2. ELK安装配置简单使用
  3. 安装pillow
  4. 将Angular6自己定义的模块发布成npm包
  5. SCUT - 336 - 酋雷姆 - 最小生成树
  6. Codeforces86D【莫队算法】
  7. oracle数据库之分组查询(转)
  8. Python 获取脚本路径以及脚本所在文件夹路径
  9. [Xcode 实际操作]五、使用表格-(9)删除UITableView单元格(手势左滑调出删除按钮)
  10. JQuery Easyui/TopJUI 基本树形表格的创建