为了账号安全,请及时绑定邮箱和手机立即绑定

比较两个对象属性但不工作

比较两个对象属性但不工作

素胚勾勒不出你 2021-08-20 15:34:49
这是我的代码。我知道这并不完全严格,但请说明为什么 let...in 在这里不能正常工作。const object1 = {here: 1, object: 3};const obj = {here: 1, object: 2};function comp(a, b) {  if (typeof a == typeof b) {    let arra = Object.keys(a);    let arrb = Object.keys(b);    for (let key in arra){      if (a[key] == b[key]) return true    }        return false  }}console.log(comp(obj, object1))以上打印,true但它应该打印false
查看完整描述

3 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

你得到true,因为你return true 在你的for循环,只要从一个对象的关键值等于键值对另一个对象。因此,当您的代码看到该here属性时,它将return true停止您的函数运行任何进一步的代码。


您需要删除此检查,并且仅return false在您的 for 循环中,这样您的 for 循环只会在它永不返回时完成(即:所有键值对都相等)。


此外,for..in循环将遍历对象中的键,因此,无需将对象的键(使用Object.keys)放入数组中(因为这样您将遍历数组的键(即:索引))。


但是,话虽如此,您可以Object.keys用来帮助解决另一个问题。您可以使用它来获取两个对象中的属性数量,因为您知道如果两个对象中的属性数量不同,则它们是不相同的


请参阅下面的示例:


const object1 = {

  here: 1,

  object: 3

};

const obj = {

  here: 1,

  object: 3

};


function comp(a, b) {

  if (typeof a == typeof b) {

    if(Object.keys(a).length !== Object.keys(b).length) {

      return false; // return false (stop fruther code execution)

    }

  

    for (let key in a) { // loop through the properties of larger object (here I've chosen 'a') - no need for Object.keys

      if (a[key] != b[key]) 

        return false; // return false (stops any further code executing)

    }

    return true; // we only reach this point if the for loop never returned false

  }

  return false; // we reach this point when the two types don't match, and so we can say they're not equal

}


console.log(comp(obj, object1))


查看完整回答
反对 回复 2021-08-20
?
呼如林

TA贡献1798条经验 获得超3个赞

你得到true,因为你return true 在你的for循环,只要从一个对象的关键值等于键值对另一个对象。因此,当您的代码看到该here属性时,它将return true停止您的函数运行任何进一步的代码。


您需要删除此检查,并且仅return false在您的 for 循环中,这样您的 for 循环只会在它永不返回时完成(即:所有键值对都相等)。


此外,for..in循环将遍历对象中的键,因此,无需将对象的键(使用Object.keys)放入数组中(因为这样您将遍历数组的键(即:索引))。


但是,话虽如此,您可以Object.keys用来帮助解决另一个问题。您可以使用它来获取两个对象中的属性数量,因为您知道如果两个对象中的属性数量不同,则它们是不相同的


请参阅下面的示例:


const object1 = {

  here: 1,

  object: 3

};

const obj = {

  here: 1,

  object: 3

};


function comp(a, b) {

  if (typeof a == typeof b) {

    if(Object.keys(a).length !== Object.keys(b).length) {

      return false; // return false (stop fruther code execution)

    }

  

    for (let key in a) { // loop through the properties of larger object (here I've chosen 'a') - no need for Object.keys

      if (a[key] != b[key]) 

        return false; // return false (stops any further code executing)

    }

    return true; // we only reach this point if the for loop never returned false

  }

  return false; // we reach this point when the two types don't match, and so we can say they're not equal

}


console.log(comp(obj, object1))


查看完整回答
反对 回复 2021-08-20
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

您应该使用for..of(或只是一个普通的 old for)而不是for..in仅用于对象。您现在正在阅读数组索引,而不是实际的键名。Object.keys返回一个Arrayof 键名,而不是一个Object

也不要早回来;现在,您在第一次钥匙检查后立即返回。


查看完整回答
反对 回复 2021-08-20
  • 3 回答
  • 0 关注
  • 172 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信