文档章节

基于jq的js对象复制的非递归算法

 甜酒0917
发布于 2016/12/01 16:40
字数 321
阅读 26
收藏 0
var extend= function() {
	var options, name, src, copy, copyIsArray, clone,
		target = arguments[ 0 ] || {},
		i = 1,
		length = arguments.length,
		deep = false;

	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {
		deep = target;

		// Skip the boolean and the target
		target = arguments[ i ] || {};
		i++;
	}

	// Handle case when target is a string or something (possible in deep copy)
	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
		target = {};
	}

	// Extend jQuery itself if only one argument is passed
	if ( i === length ) {
		target = this;
		i--;
	}

	for ( ; i < length; i++ ) {

		// Only deal with non-null/undefined values
		if ( ( options = arguments[ i ] ) != null ) {
        
			// Extend the base object
			for ( name in options ) {
				
				
				src = target[ name ];
				copy = options[ name ];
    
				// Prevent never-ending loop
				if ( target === copy ) {
				
					continue;
				}

				// Recurse if we're merging plain objects or arrays
              if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
					( copyIsArray = jQuery.isArray( copy ) ) ) ) {
				   

					if ( copyIsArray ) {
						copyIsArray = false;
						clone = src && jQuery.isArray( src ) ? src : [];

					} else {
						clone = src && jQuery.isPlainObject( src ) ? src : {};
					}                  
                   var ary=[];
				   var mem={};
			       mem['.'+name]=jQuery.isPlainObject( copy )?{}:(jQuery.isArray( copy ) ? [] : '');	  
                   for(var j in copy){
                       ary.push({name:'.'+name+'.'+j,value:copy[j]});
			           mem['.'+name+'.'+j]=jQuery.isPlainObject( copy[j] )?{}:(jQuery.isArray( copy[j] ) ? [] : '');
                   }
				   
				   
               while(ary.length>0){
                    var temb=ary.shift();
						
                  if( jQuery.isPlainObject( temb.value ) ||( copyIsArray = jQuery.isArray( temb.value ))){
                 	   mem[temb.name]=jQuery.isPlainObject( temb.value )?{}:(jQuery.isArray( temb.value ) ? [] : '');            
                       for(var k in temb.value){			
                           ary.push({name:temb.name+'.'+k,value:temb.value[k]});
                           mem[temb.name+'.'+k]=jQuery.isPlainObject( temb.value[k] )?{}:(jQuery.isArray( temb.value[k] ) ? [] : '');            
                         }                        
				  }else{
					  var aryA=temb.name.split(".");
					  var tembName='';
                      var tempTarget=target;
					  for(var n=1,len=aryA.length;n<len;n++){
					     if(tempTarget!=undefined){
						    console.log('1',tempTarget)
                            if(n!=(len-1)){						  
						     tempTarget[aryA[n]]=tempTarget[aryA[n]]||mem[tembName+'.'+aryA[n]];					   
						    }else{							
                            tempTarget[aryA[n]]=temb.value;						
						    }
						    tembName=tembName+'.'+aryA[n];
						    tempTarget= tempTarget[aryA[n]];	
					     }
					   }
					 }
                   }
				// Don't bring in undefined values
				} else if ( copy !== undefined ) {
				
					target[ name ] = copy;
				}
			}
		}
	}
	// Return the modified object
		console.log(target)
	return target;
};
var a={a:{a:1,b:2},b:3,c:{e:44,ff:[1,4,5]}};	
var b={};
	extend(true,b,a);
	alert(b.c.ff[1])

 

© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 13
码字总数 3450
作品 0
武汉
JS杂谈系列-js的认识和js相关技术的了解

其实这篇博客应该是在讲js之前写的,现在算是补上的内容吧,我写的都是自己了解的,可不是凭空捏造,当然很多会记不清,错了及时提出啊!我写的时候也是写有用的,不会写一点子扯淡的玩意,像...

透笔度
2015/08/16
0
0
javascript 垃圾回收算法了解一下

我们通常理解的 javascript 垃圾回收机制都停留在表面,"会释放不被引用变量内存",最近在读《深入浅出node.js》的书,详细了解了下 v8 垃圾回收的算法,记录了一些学习笔记。 敲黑板:v8引擎...

程序员解决师
06/12
0
0
JS三教九流系列-require.js-网站模块化开发

js开发的模块化就是module处理 简单理解js模块化的开发就是让我们的web项目对js进行分类的处理 我们在开发网站的时候,里面会用要很多的类库,如jquery,还会有到基于jq各种插件,还会有其他...

透笔度
2015/08/19
0
0
JavaScript专题之递归

JavaScript 专题系列第十八篇,讲解递归和尾递归 定义 程序调用自身的编程技巧称为递归(recursion)。 阶乘 以阶乘为例: 示意图(图片来自 wwww.penjee.com): 斐波那契数列 在《JavaScript专...

冴羽
2017/09/13
0
0
用js来实现那些数据结构及算法—目录

  首先,有一点要声明,下面所有文章的所有内容的代码,都不是我一个人独立完成的,它们来自于一本叫做《学习JavaScript数据结构和算法》(第二版),人民邮电出版社出版的这本书。github代...

zaking
05/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

驰狼课堂

http://www.chilangedu.com/

求是科技
10分钟前
0
0
jumpserver 报错"Incorrect string value

申明 本文所有内容参考自jumpserver记录命令无法入库问题 #1773 简介 jumpserver 1.4.0在jumpserver.log中大量报错,错误日志 File "/opt/jumpserver/apps/terminal/api.py", line 246, i...

zhnxin
17分钟前
1
0
用户管理相关配置文件及命令

9月19日任务 2.27linux和windows互传文件 3.1 用户配置文件和密码配置文件 3.2 用户组管理 3.3 用户管理 扩展知识 实用小工具 简单命令行下实现Linux/Windows文件互传 前提:使用远程工具Xsh...

robertt15
35分钟前
0
0
presto 架构

presto 介绍 是Facebook开源的,完全基于内存的并⾏计算,分布式SQL交互式查询引擎 是一种Massively parallel processing (MPP)架构,多个节点管道式执⾏ ⽀持任意数据源(通过扩展式Connect...

张欢19933
35分钟前
0
0
Ajax技术应用

1. 相关概述 1. ajax:即异步js与xml,可以实现客户端与服务端之间数据的异步交互。对于普通的B/S 模式是采用的同步方式,即一次请求必须等待一次服务器响应完成,而异步则是客户端发送请求后...

江左煤郎
35分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部