JS工具函数库(持续更新)

//数组去重1
Array.prototype.removal = function () {
	var newArr = [];
	var obj = {};
	for (var i = 0; i < this.length; i++) {
		if (!obj[this[i]]) {
			obj[this[i]] = "abc";
			newArr.push(this[i]);
		}
	}
	return newArr;
};

//数组去重2
function ES6Sort(arr) {
	var newArr = arr.filter(function (item, index, self) {
		return self.indexOf(item) === index;
	});
	return newArr;
}

//数组去重3
Array.prototype.setDuplicateRemoval = function () {
	return Array.from(new Set(this));
};

//数组去重4
Array.prototype.indexOfSort = function () {
	var newArr = [];
	for (var i = 0; i < this.length; i++) {
		var n = this[i];
		newArr.indexOf(n) === -1 && newArr.push(n);
	}
	return newArr;
};

//深拷贝
Object.prototype.deepClone = function (target, origin) {
	var target = target || {};
	for (var prop in origin) {
		if (origin.hasOwnProperty(prop)) {
			if (typeof origin[prop] === "object") {
				//如果是引用值
				if (Object.prototype.toString.call(origin[prop]) === "[object Array]") {
					//如果是数组引用值
					target[prop] = [];
				} else {
					//如果是对象引用值
					target[prop] = {};
				}
				deepClone(target[prop], origin[prop]);
			} else {
				//如果是原始值
				target[prop] = origin[prop];
			}
		}
	}
	return target;
};

//通过JSON实现深拷贝(会忽略掉函数)
function deepclone(target, origin) {
	target = JSON.parse(JSON.stringify(origin));
	return target;
}

//返回字节长度
Object.prototype.retBytes = function () {
	var len = this.length;
	for (var i = 0; i < len; i++) {
		if (this.charCodeAt(i) >= 255) {
			len++;
		}
	}
	return len;
};

//冒泡排序
Array.prototype.bubSort = function () {
	var len = this.length,
		temp;
	for (var i = 0; i < len; i++) {
		for (var j = i + 1; j < len; j++) {
			if (this[i] < this[j]) {
				[this[i], this[j]] = [this[j], this[i]];
			}
		}
	}
	return this;
};

//快速排序
Array.prototype.quickSort = function () {
	if (this.length < 2) {
		return this;
	}
	var left = [],
		right = [],
		radix = this[0];

	this.shift();
	for (var i = 0, len = this.length; i < len; i++) {
		if (radix > this[i]) {
			left.push(this[i]);
		} else {
			right.push(this[i]);
		}
	}
	return [].concat(left.quickSort(), radix, right.quickSort());
};

//选择排序
Array.prototype.selectSort = function () {
	for (var i = 0, len = this.length; i < len - 1; i++) {
		var index = i;
		for (var j = i + 1; j < len; j++) {
			if (this[index] > this[j]) {
				index = j;
			}
		}
		[this[i], this[index]] = [this[index], this[i]];
	}
	return this;
};

//二分查找
Array.prototype.twoPoints = function (low, high, n) {
	var center = Math.floor((low + high) / 2);

	if (this[center] == n) {
		return center;
	} else if (this[center] > n) {
		this.twoPoints(low, center - 1, n);
	} else if (this[center] < n) {
		this.twoPoints(center + 1, this.length - 1, n);
	}
};

//斐波那契数列第n位
function fibonacci(n) {
	if (n == 1 || n == 2) {
		return 1;
	}
	return fibonacci(n - 1) + fibonacci(n - 2);
}

//n的阶乘
function factorial(n) {
	if (n == 1) {
		return 1;
	}
	return n * factorial(n - 1);
}

//速度框架
(function () {
	var requestAnimationFrame =
		window.requestAnimationFrame ||
		function (fn) {
			return setTimeout(fn, 1000 / 60);
		};

	var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;

	function move(ele, attr, targetVal, speed) {
		var CSSdom = ele.currentStyle || getComputedStyle(ele),
			startVal = parseFloat(CSSdom[attr]) || 0,
			targetVal = parseFloat(targetVal),
			bool = targetVal > startVal,
			speed = bool ? speed : -speed;

		function m() {
			startVal += speed;

			var ifEnd = bool ? startVal >= targetVal : startVal <= targetVal;

			ifEnd && (startVal = targetVal);

			ele.style[attr] = startVal + "px";

			!ifEnd && requestAnimationFrame(m);
		}

		requestAnimationFrame(m);
	}

	window.move = move;
})();

//碰撞检测
function isCollision(ele1, ele2) {
	var L1 = ele1.offsetLeft,
		U1 = ele1.offsetTop,
		R1 = ele1.offsetLeft + ele1.clientWidth,
		B1 = ele1.offsetTop + ele1.clientWidth,
		L2 = ele2.offsetLeft,
		U2 = ele2.offsetTop,
		R2 = ele2.offsetLeft + ele2.clientWidth,
		B2 = ele2.offsetTop + ele2.clientHeight;

	if (R1 >= L2 && B1 >= U2 && L1 <= R2 && U1 <= B2) {
		return true;
	} else {
		return false;
	}
}

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值