闲暇无聊中翻阅vuejs的源码,在里边发现了一个比较强壮的对比方法连数组对象都能正确对比;后边还有可以获取某个值在数据中是否存在,一个比较强壮的indexOf,如果对你有用欢迎点赞收藏和分享。
话不多说,直接上代码:
/**
* 判断是否为基础类型object(这为基础类型判断,所以数组和对象是区分不开的,只为下边对比使用)
* @param {any} obj 传入要判断的数据类型
* @returns 为object的为 true, 否则为false
*/
function isObject (obj) {
return obj !== null && typeof obj === 'object'
}
/**
* 判断两个值是否相等
* @param {any} a 任意数据类型
* @param {any} b 任意数据类型
* @returns true 为一致, false 为不相等
*/
function looseEqual (a, b) {
if (a === b) { return true }
var isObjectA = isObject(a);
var isObjectB = isObject(b);
if (isObjectA && isObjectB) {
try {
var isArrayA = Array.isArray(a);
var isArrayB = Array.isArray(b);
if (isArrayA && isArrayB) {
return a.length === b.length && a.every(function (e, i) {
return looseEqual(e, b[i])
})
} else if (a instanceof Date && b instanceof Date) {
return a.getTime() === b.getTime()
} else if (!isArrayA && !isArrayB) {
var keysA = Object.keys(a);
var keysB = Object.keys(b);
return keysA.length === keysB.length && keysA.every(function (key) {
return looseEqual(a[key], b[key])
})
} else {
/* istanbul ignore next */
return false
}
} catch (e) {
/* istanbul ignore next */
return false
}
} else if (!isObjectA && !isObjectB) {
return String(a) === String(b)
} else {
return false
}
}
/**
* 获取在集合中,当前值的位置
* @param {any} arr 传入的集合
* @param {any} val 要查询是否在集合中位置的值
* @returns -1 为不存在,0或0以上为存在的位置下标
*/
function looseIndexOf (arr, val) {
for (var i = 0; i < arr.length; i++) {
if (looseEqual(arr[i], val)) { return i }
}
return -1
}
亲测有效,如有疑问欢迎留言。(作者较懒直接搬运,没有改成es6方式,如有需要自行改动)