JS判断两个值是否相等,任意两个值对比,包括数组对象的对比

闲暇无聊中翻阅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方式,如有需要自行改动)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值