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

为什么 JavaScript 没有进入 For...in 循环

为什么 JavaScript 没有进入 For...in 循环

翻过高山走不出你 2021-10-14 16:48:44
出于某种原因,当我逐行执行时,下面的 for...in 循环不会执行。看起来它读取 Object 和 'let outerLoopProp' 语句,然后跳过整个循环体。循环位于表单提交事件中。我已将对象记录到控制台,并在代码到达 for..in 循环时用属性填充它。form1.addEventListener("submit", (e) => {  e.preventDefault();  let forValidationCheck = {};  let allNames = ["Tarp 1", "Tarp 2", "Tarp 3"];  for(let r = 0; r < allNames.length; r++) {                        let currentChosen = allNames[r].toLowerCase();    let optionsForCheck = document.getElementById(`selection${r+1}`);    let selectedArrayForCheck = [];                        for(z=0; z < optionsForCheck.options.length; z++) {      if(optionsForCheck.options[z].selected === true) {          selectedArrayForCheck.push(optionsForCheck.options[z].value.toLowerCase());      }    }    Object.defineProperty(forValidationCheck, currentChosen, {        value: selectedArrayForCheck    })  }  for(let layerOuterLoop in forValidationCheck) {      //Code within for..in loop  }});<form id="form1">  <select name="selection1" id="selection1">    <option value="Tarp 1">Tarp 1</option>    <option value="Tarp 2">Tarp 2</option>  </select>  <select name="selection2" id="selection2" >    <option value="Tarp 2">Tarp 2</option>    <option value="Tarp 3">Tarp 3</option>  </select>  <select name="selection3" id="selection3">    <option value="Tarp 1">Tarp 1</option>    <option value="Tarp 3">Tarp 3</option>  </select>  <button type="submit">submit</button></form>
查看完整描述

2 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

解决方法:在使用Object.defineProperty()时,需要为方法的第三个参数设置enumerable:true。见下文。感谢大家的帮助!


form1.addEventListener("submit", (e) => {

    e.preventDefault();


 let forValidationCheck = {};

 let allNames = ["Tarp 1", "Tarp 2", "Tarp 3"];


    for(let r = 0; r < allNames.length; r++) {

                    

                    let currentChosen = allNames[r].toLowerCase();

                    let optionsForCheck = document.getElementById(`selection${r+1}`);

                    let selectedArrayForCheck = [];

                    

                    for(z=0; z < optionsForCheck.options.length; z++) {

                        if(optionsForCheck.options[z].selected === true) {

                            selectedArrayForCheck.push(optionsForCheck.options[z].value.toLowerCase());

                        }

                    }

                    Object.defineProperty(forValidationCheck, currentChosen, {

                        value: selectedArrayForCheck,

                        enumerable: true

                    })

                }



                for(let layerOuterLoop in forValidationCheck) {


                   //Code within for..in loop


                }


});

<html>


<head>


</head>


<body>


<form id="form1">


  <select name="selection1" id="selection1">

    <option value="Tarp 1">Tarp 1</option>

    <option value="Tarp 2">Tarp 2</option>

  </select>


  <select name="selection2" id="selection2">

    <option value="Tarp 2">Tarp 2</option>

    <option value="Tarp 3">Tarp 3</option>

  </select>


  <select name="selection3" id="selection3">

    <option value="Tarp 1">Tarp 1</option>

    <option value="Tarp 3">Tarp 3</option>

  </select>


</form>


</body>


</html>


查看完整回答
反对 回复 2021-10-14
?
LEATH

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

做同样的事情更简单:


const myForm   = document.getElementById('form1')

    , allNames ={ 'Tarp 1': myForm.selection1

                , 'Tarp 2': myForm.selection2

                , 'Tarp 3': myForm.selection3

                }


myForm.onsubmit=e=>

  {

  e.preventDefault()

  let forValidationCheck = {}


  for (let aN in allNames)

    {

    forValidationCheck[aN.toLowerCase()] = allNames[aN].value

    //forValidationCheck[aN.toLowerCase()] = [allNames[aN].value] //if prefered 

    }


  for (let layerOuterLoop in forValidationCheck)

    {

    console.log(layerOuterLoop, ' => ',forValidationCheck[layerOuterLoop] )

    }

  }


/* -- in case of selects are multiple : -...

  for (let aN in allNames)

    {

    forValidationCheck[aN.toLowerCase()] = [...allNames[aN].options]

                                              .filter(option=>option.selected)

                                              .map(option=>option.value)

    }

*/

<form id="form1">


  <select name="selection1">

    <option value="Tarp 1">Tarp 1</option>

    <option value="Tarp 2">Tarp 2</option>

  </select>


  <select name="selection2">

    <option value="Tarp 2">Tarp 2</option>

    <option value="Tarp 3">Tarp 3</option>

  </select>


  <select name="selection3">

    <option value="Tarp 1">Tarp 1</option>

    <option value="Tarp 3">Tarp 3</option>

  </select>


  <button type="submit">submit</button>

</form>


查看完整回答
反对 回复 2021-10-14
  • 2 回答
  • 0 关注
  • 296 浏览
慕课专栏
更多

添加回答

举报

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