自定义数组方法

Posted by 松一老贼 on January 20, 2018

pop

自定义pop()方法:删除数组最后一项,并返回被删除项

Array.prototype.m_shift = function () {
	if (this.length > 0) {
		var first = this[0];
		for (var i = 1; i < this.length; i++) {
			this[i - 1] = this[i];
		}
		this.length--;
		return first;
	}
};

push

自定义push() 方法:向数组末尾添加一项,并返回新数组长度

Array.prototype.m_push = function () {
  for (var i = 0; i < arguments.length; i++) {
    this[this.length] = arguments[i];
  }
  return this.length;
};

shift

自定义 shift() 方法:移除数组中的第一个项并返回该项,同时数组的长度减 1

Array.prototype.m_shift = function () {
	if (this.length > 0) {
		var first = this[0];
		for (var i = 1; i < this.length; i++) {
			this[i - 1] = this[i];
		}
		this.length--;
		return first;
	}
};

unshift

自定义 unshift() 方法:在数组前端添加任意个项并返回新数组长度。

Array.prototype.m_unshift = function () {
	for (var i = this.length - 1; i >= 0; i--) {
		this[i + arguments.length] = this[i];
	}
	for (i = 0; i < arguments.length; i++) {
		this[i] = arguments[i];
	}
	return this.length;
};

slice

自定义slice()方法基于当前数组中的一个或多个项创建一个新数组,接受一个或两个参数,返回新数组

Array.prototype.m_slice = function (start, end) {
	var arr = [];
	start = isNaN(start) ? 0 : Number(start);
	if (end === undefined) {
		end = this.length;
	} else {
		end = isNaN(end) ? 0 : Number(end);
	}
	//处理负数
	start = start >= 0 ? start : start + this.length;
	end = end >= 0 ? end : end + this.length;
	//处理下限值
	start = start < 0 ? 0 : start;
  	end = end < 0 ? 0 : end;
	// 处理上限值
	start = start > this.length ? this.length : start;
	end = end > this.length ? this.length : end;

	//截取数组
	for (var i = start; i < end; i++) {
		arr[arr.length] = this[i];
	}
	return arr;
};

splice

自定义 splice(n,m,[x]) :从索引n开始删除m项,然后用x的内容替换删除的内容,返回被删除的元素构成的数组,如果没有删除返回[]

Array.prototype.m_splice = function (start, len) {
	// 处理参数
	//处理特殊值
	if (start === undefined) {
		start = this.length;
	} else {
		start = isNaN(start) ? 0 : Number(start);
	}
	if (len === undefined) {
		len = this.length;
	} else {
		len = isNaN(len) ? 0 : Number(len);
	}

	//处理负数
	start = start >= 0 ? start : start + this.length;
	//处理下限值
	start = start < 0 ? 0 : start;
	len = len < 0 ? 0 : len;
	// 处理上限值
	start = start > this.length ? this.length : start;
	len = len > this.length - start ? this.length - start : len;

	// 操作数组:把原数组拆分成三块:左边不删除的,中间删除的,右边不删除的
	var left = [];
	var arr = [];
	var right = [];
	for (var i = 0; i < this.length; i++) {
		if (i < start) {
			left[left.length] = this[i];
		} else if (i >= start && i < start + len) {
			arr[arr.length] = this[i];
		} else {
			right[right.length] = this[i];
		}
	}
	// 拼接
	if (arguments.length > 2) {//替换内容不为空
		//把替换内容拼接到left数组后边
		for (i = 2; i < arguments.length; i++) {
			if (Array.isArray(arguments[i])) {//如果存在数组
				for (var j = 0; j < arguments[i].length; j++) {
					left[left.length] = arguments[i][j];
				}
			} else {
				left[left.length] = arguments[i];
			}
		}
	}
	//把right数组拼接到left数组后边
	for (i = 0; i < right.length; i++) {
		left[left.length] = right[i];
	}
	// 把left的值赋给this
	for (i = 0; i < left.length; i++) {
		this[i] = left[i];
	}
	//修改数组长度
	this.length = left.length;
	return arr;
};