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

我出于某种原因试图查看某个数字是否在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",

}


慕标琳琳
浏览 189回答 4
4回答

叮当猫咪

您可以避免使用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)

呼啦一阵风

以这种方式使用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];  }}

慕妹3242003

您需要检查数组的值(如果它在对象中),而不是通过获取索引来检查索引的值是否在数组中。这条线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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript