JS 小练习

JS 小练习

数组深度拷贝

在JS中,对于对象类型的变量的引用是通过类似C之类的“指针”的方式来操作的,及如果多个变量引用同一个对象,则任意一个变量对对象的操作都会影响到其它的变量。因此如果要创建一个与已经存在的对象内容相同的对象,不能通过简单的赋值操作。

var a=[1,2,3,4];
var b=a;
a.pop();
alert(a); //弹出1,2,3
alert(b); //弹出1,2,3

方法一 (性能低)

Array.prototype.clone = function(){
  var a=[];
  for (var i = 0, l = this.length; i < l; i++) {
    a.push(this[i]);
    return a;
  }
}

方法二

Array.prototype.clone = function() {
  return this.slice(0);
}

方法三

Array.prototype.clone = function() {
  return [].concat(this);
} //或者 Array.prototype.clone=function(){ return this.concat(); }

对象深度克隆

function cloneObject(obj) {
  var o = obj.constructor === Array ? [] : {};

  for (var i in obj) {
    if ( obj.hasOwnProperty(i) ) {
      o[i] = typeof obj[i] === "object" ? cloneObject(obj[i]) : obj[i];
    }
  }
  return o;
}

数组拍平

1、递归

var result = []
function unfold(arr){
     for(var i=0;i< arr.length;i++){
      if(typeof arr[i]=="object" && arr[i].length>1) {
       unfold(arr[i]);
     } else {        
       result.push(arr[i]);
     }
  }
}
var arr = [1,3,4,5,[6,[0,1,5],9],[2,5,[1,5]],[5]];
unfold(arr)

2、使用tostring

var c=[1,3,4,5,[6,[0,1,5],9],[2,5,[1,5]],[5]];
var b = c.toString().split(',')

3、使用es6的reduce函数

var arr=[1,3,4,5,[6,[0,1,5],9],[2,5,[1,5]],[5]];
const flatten = arr => arr.reduce((a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []);
var result = flatten(arr);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容