isEqual函数总是返回true

时间:2016-12-22 02:51:48

标签: javascript function

此函数检查两个对象是否具有相同的值:

_.isEqual = (a, b) => {
  const aKeys = Object.getOwnPropertyNames(a)
  const bKeys = Object.getOwnPropertyNames(b)
  if (aKeys.length !== bKeys.length) {
    return false
  }
  for (var i = 0; i < aKeys.length; i++) {
    var propName = aKeys[i]
    if (a[propName] !== b[propName]) {
      return false
    }
  }
  return true
}

我用every替换了for循环:

_.isEqual = (a, b) => {
  const aKeys = Object.getOwnPropertyNames(a)
  const bKeys = Object.getOwnPropertyNames(b)
  if (aKeys.length !== bKeys.length) return
  return aKeys.every((key, index) => {
    return key === bKeys[index]
  })
}

但是,即使a和b不相等,函数也会返回true

我做错了什么?

输入:

const obj1 = {
  x: 0,
  y: 0,
  z: 0
}

const obj2 = {
  x: 0,
  y: 0,
  z: 0
}

4 个答案:

答案 0 :(得分:1)

Join<Entity1,Entity2> join = root.join("relationshipA", JoinType.LEFT);
如果我将var first = "hello" var second = "meow" console.log("recognized") isEqual(first,second); function isEqual(a, b) { console.log("running") const aKeys = Object.getOwnPropertyNames(a) const bKeys = Object.getOwnPropertyNames(b) if (aKeys.length !== bKeys.length) { console.log("false") return false } for (var i = 0; i < aKeys.length; i++) { var propName = aKeys[i] if (a[propName] !== b[propName]) { console.log("false") return false } } console.log("return true") return true } 更改为second,则

打印出false,它将打印出true。我会说它与您的输入数据有关。您是否尝试使用较小的输入数据集以确保其良好状态?

更新:或者仅在第二次交互时才出现问题?如果是这种情况,你有两个hello陈述

return

这可能就是你要找的东西。如果var first = ["shoop", "doop", "woop", "loop", "koop"] var second = ["hamp","damp", "samp", "wamp"] console.log("recognized") var returned = isEqual(first,second); console.log(returned) function isEqual(a, b) { const aKeys = Object.getOwnPropertyNames(a) const bKeys = Object.getOwnPropertyNames(b) if (aKeys.length !== bKeys.length) { return aKeys.every((key, index) => { key === bKeys[index] }) } } akey长度不相等,则bkey方法会执行此操作,并在此情况下返回every falsekey不相等,返回bkeyfalse不成立,if (aKeys.length !== bKeys.length)将作为js

的性质返回

在回复“如何返回true或false”时,如果if语句从未运行,则undefined等于{{1} }}

true

答案 1 :(得分:1)

有几件事要讨论:

1。箭头函数有两种形式:

  1. (x) => x返回x。
  2. (x) => { ... }像普通函数一样执行{}内的语句。
  3. return中添加{}或将其修改为第一个表单。

    return aKeys.every((key, index) => {
      return key === bKeys[index]
    })
    

    return aKeys.every((key, index) => key === bKeys[index])
    

    2。物业清单未订购

    Object.getOwnPropertyNames({a:1, b:2, c:3})无法保证按['a', 'b', 'c']的顺序返回。取决于JS实现。 V8努力保持秩序,但不是所有的JS实现都会。它可以返回['c', 'a', 'b']

    要解决此问题,您可以对列表进行排序。

    const aKeys = Object.getOwnPropertyNames(a).sort()
    const bKeys = Object.getOwnPropertyNames(b).sort()
    

    3。比较值和键。

    如上所述,您的循环仅比较键。 {a:1, b:2}{a:5, b:5}将返回true,因为您只检查ab是否存在,但不会比较它们的值。

    你可以这样做:

    return aKeys.every((key, index) => {
      if (key !== bKeys[index]) return false
      if (a[key] !== b[key]) return false
    })
    

    但它只测试浅层物体。如果一个对象包含另一个对象,它将始终从{} !== {}返回false。你需要添加一个检查“如果它是一个对象,然后递归调用_isEqual”。

    4。订购/排序键的替代方法:

    您可以这样做,而不是订购密钥:

    return aKeys.every((key, index) => {
      return b.hasOwnProperty(key)
    })
    

    但可能性能较差。尝试基准来看看。

答案 2 :(得分:0)

我找到了解决方案:

_.isEqual = (a, b) => {
  const aKeys = Object.getOwnPropertyNames(a)
  const bKeys = Object.getOwnPropertyNames(b)
  if (aKeys.length !== bKeys.length) return
  return aKeys.every((key, index) => a[key] === b[bKeys[index]])
}

我正在评估keys而不是values!这就是函数始终返回true的原因。

答案 3 :(得分:-1)

在修改后的代码中,您需要返回false或结果。你应该添加一个else语句:

_.isEqual = (a, b) => {
  const aKeys = Object.getOwnPropertyNames(a)
  const bKeys = Object.getOwnPropertyNames(b)
  if (aKeys.length !== bKeys.length){
     return false;
  } else { // <-- this is new here //
     return aKeys.every((key, index) => {
       key === bKeys[index]
     })
  }