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

在Object.keys(obj)中只能兼职

在Object.keys(obj)中只能兼职

慕标琳琳 2021-04-09 17:15:28
我出于某种原因试图查看某个数字是否在Object.keys()中,我得到了部分响应,某些数字未包含在最终对象中。知道为什么in这里只能部分工作吗?var arrayOfNumbersIHave = [  "542009988",  "7411111111",  "542261111",  "542009988",  "7411111111",  "7411111111",  "7442334675",  "661766029",  "692549335",]var snapObject = {  "542009988": "A",  "542261111": "B",  "661766029": "C",  "6617666029": "D",  "692549335": "E",  "7442334675": "F",  "7411111111": "G",}var objToDisplay = {};for (const i in arrayOfNumbersIHave) {  if (i in Object.keys(snapObject)) {    objToDisplay[arrayOfNumbersIHave[i]] = snapObject[arrayOfNumbersIHave[i]]  }}console.log(objToDisplay)结果:{  "542009988": "A",  "542261111": "B",  "7442334675": "F",  "7411111111": "G",}预期结果:{  "542009988": "A",  "542261111": "B",  "661766029": "C",  "692549335": "E",  "7442334675": "F",  "7411111111": "G",}
查看完整描述

4 回答

?
叮当猫咪

TA贡献1776条经验 获得超12个赞

您可以避免使用for..in迭代数组。或者,您可以reduce在arrayOfNumbersIHave&上 使用,每个迭代curr参数将代表的每个元素 arrayOfNumbersIHave。使用它curr来检查中是否存在相同名称的密钥 snapObject。是这样然后在累加器对象中添加键和值


let arrayOfNumbersIHave = [

  "542009988",

  "7411111111",

  "542261111",

  "542009988",

  "7411111111",

  "7411111111",

  "7442334675",

  "661766029",

  "692549335",

]


let snapObject = {

  "542009988": "A",

  "542261111": "B",

  "661766029": "C",

  "6617666029": "D",

  "692549335": "E",

  "7442334675": "F",

  "7411111111": "G",

}


let objToDisplay = arrayOfNumbersIHave.reduce(function(acc, curr) {

  if (snapObject[curr]) {

    acc[curr] = snapObject[curr]

  }

  return acc;

}, {}) // {} is accumulator object 


console.log(objToDisplay)


查看完整回答
反对 回复 2021-04-15
?
呼啦一阵风

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

以这种方式使用in运算符并不完全正确。 in检查对象的属性或数组的索引。因此,true仅当您要检查的数字恰好是数组中的索引时,它才可能返回。


因此,在这种情况下,您确实要忽略Object.keys,而是使用:


for (const i in arrayOfNumbersIHave) {

  if (arrayOfNumbersIHave[i] in snapObject) {

    objToDisplay[arrayOfNumbersIHave[i]] = snapObject[arrayOfNumbersIHave[i]]

  }

}

就像@adiga在下面指出的那样,我们可以通过for...of循环简化此过程,以得到:


for (const val of arrayOfNumbersIHave) {

  if (val in snapObject) {

    objToDisplay[val] = snapObject[val];

  }

}


查看完整回答
反对 回复 2021-04-15
?
慕妹3242003

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

您需要检查数组的值(如果它在对象中),而不是通过获取索引来检查索引的值是否在数组中。


这条线


if (arrayOfNumbersIHave[i] in snapObject) {

将arrayOfNumbersIHave[i]as的值用作与in运算符和对象进行检查的键。


var arrayOfNumbersIHave = ["542009988", "7411111111", "542261111", "542009988", "7411111111", "7411111111", "7442334675", "661766029", "692549335"],

    snapObject = { 542009988: "A", 542261111: "B", 661766029: "C", 6617666029: "D", 692549335: "E", 7442334675: "F", 7411111111: "G" },

    objToDisplay = {};


for (const i in arrayOfNumbersIHave) {

    if (arrayOfNumbersIHave[i] in snapObject) {

        objToDisplay[arrayOfNumbersIHave[i]] = snapObject[arrayOfNumbersIHave[i]];

    }

}


console.log(objToDisplay);


查看完整回答
反对 回复 2021-04-15
  • 4 回答
  • 0 关注
  • 188 浏览
慕课专栏
更多

添加回答

举报

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