微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么数组在循环后似乎是空的?

如何解决为什么数组在循环后似乎是空的?

function par(idF,idM) {
  this.IDOvna = idM;
  this.IDOvce = idF;

}



function breeding() {
  let idOvce = [];
  let brovce = [];
  let mesecOvce = [];
  let godinaOvce = [];
  let istorija1 = [];
  let istorija2 = [];

  let idOvna = [];
  let brovna = [];
  let mesecOvna = [];
  let godinaOvna = [];

  let y = 0;
  let o = 0;
  let parovi = [];
  let c = 0;
  fetch("http://localhost/ovce/ovce.json")
    .then(function(resp) {
      return resp.json();
    })
    .then(function(data) {
      console.log(data);
      for (let i = 0; i < data.ovce.length; i++) {
        idOvce[i] = data.ovce[i].id;
        brovce[i] = data.ovce[i].broj;
        mesecOvce[i] = data.ovce[i].mesec;
        godinaOvce[i] = data.ovce[i].godina;
        istorija1[i] = data.ovce[i].istorija1;
        istorija2[i] = data.ovce[i].istorija2;
      }
    });
  fetch("http://localhost/ovce/ovnovi.json")
    .then(function(resp1) {
      return resp1.json();
    })
    .then(function(data1) {
      console.log(data1);
      for (let g = 0; g < data1.ovnovi.length; g++) {
        idOvna[g] = data1.ovnovi[g].id;
        brovna[g] = data1.ovnovi[g].broj;
        mesecOvna[g] = data1.ovnovi[g].mesec;
        godinaOvna[g] = data1.ovnovi[g].godina;
      }
    });

  while (o < idOvna.length) {
    y = 0;
    while (y < idOvce.length) {
      if (istorija1[y] != 0) {
        if ((istorija2[y] != idOvna[o]) && (istorija2[istorija1[y]] != idOvna[o])) {
          parovi[c] = new par(idOvce[y],idOvna[o]);
          c++;
        }
      } else {
        parovi[c] = new par(idOvce[y],idOvna[o]);
        c++;
      }
      y++;
    }
    o++;
  }
  console.log(parovi);
  return parovi;
}
<html>

<head>
  <title>Sheepify</title>
  <script src="main.js"></script>
</head>

<body>
  <button onclick="breeding()"> Breeding </button>
</body>

</html>

在javascript中,我运行了一个循环,然后应填充的pairs数组为空。

function pair(idF,idM) {
  this.IDOvna = idM;
  this.IDOvce = idF;
}

function problem() {
  let y = 0;
  let o = 0;
  let pairs = [];
  let c = 0;

  //id,id1,history1,history2 are arrays which are populated from the json files using fetch.

  while (o < id.length) {
    y = 0;
    while (y < id1.length) {
      if (history1[y] != 0) {
        if ((history2[y] != id[o]) && (history2[history1[y]] != id[o])) {
          pairs[c] = new pair(id1[y],id[o]);
          c++;
        }
      } else {
        pairs[c] = new pair(id1[y],id[o]);
        c++;
      }
      y++;
    }
    o++;
  }
  console.log(pairs);
  console.log(pairs.length);
}

当我运行调试器时,将填充该数组,并且一切都很好,但是当我在单击按钮或通过控制台执行该功能时,它只会返回一个空数组。是什么导致此问题? 编辑:我不小心将对函数粘贴到问题函数中,事实并非如此。我已经把它移走了。并按照建议将长度更改为长度。 EDIT2:这是完整的代码,抱歉变量名称,它们在塞尔维亚语中。

解决方法

处理数组的循环不在fetch回调函数之外,因此它不等待数组被填充。参见Why is my variable unaltered after I modify it inside of a function? - Asynchronous code reference

您可以使函数async并使用await来等待它们。

还要注意,调用此代码的代码将需要使用await.then()来获取返回的parovi数组。参见How do I return the response from an asynchronous call?

async function breeding() {
  let idOvce = [];
  let brOvce = [];
  let mesecOvce = [];
  let godinaOvce = [];
  let istorija1 = [];
  let istorija2 = [];

  let idOvna = [];
  let brOvna = [];
  let mesecOvna = [];
  let godinaOvna = [];

  let y = 0;
  let o = 0;
  let parovi = [];
  let c = 0;
  await fetch("http://localhost/ovce/ovce.json")
    .then(function(resp) {
      return resp.json();
    })
    .then(function(data) {
      console.log(data);
      for (let i = 0; i < data.ovce.length; i++) {
        idOvce[i] = data.ovce[i].id;
        brOvce[i] = data.ovce[i].broj;
        mesecOvce[i] = data.ovce[i].mesec;
        godinaOvce[i] = data.ovce[i].godina;
        istorija1[i] = data.ovce[i].istorija1;
        istorija2[i] = data.ovce[i].istorija2;
      }
    });
  await fetch("http://localhost/ovce/ovnovi.json")
    .then(function(resp1) {
      return resp1.json();
    })
    .then(function(data1) {
      console.log(data1);
      for (let g = 0; g < data1.ovnovi.length; g++) {
        idOvna[g] = data1.ovnovi[g].id;
        brOvna[g] = data1.ovnovi[g].broj;
        mesecOvna[g] = data1.ovnovi[g].mesec;
        godinaOvna[g] = data1.ovnovi[g].godina;
      }
    });

  while (o < idOvna.length) {
    y = 0;
    while (y < idOvce.length) {
      if (istorija1[y] != 0) {
        if ((istorija2[y] != idOvna[o]) && (istorija2[istorija1[y]] != idOvna[o])) {
          parovi[c] = new par(idOvce[y],idOvna[o]);
          c++;
        }
      } else {
        parovi[c] = new par(idOvce[y],idOvna[o]);
        c++;
      }
      y++;
    }
    o++;
  }
  console.log(parovi);
  return parovi;
}

function par(idF,idM) {
  this.IDOvna = idM;
  this.IDOvce = idF;
}
<html>

<head>
  <title>Sheepify</title>
  <script src="main.js"></script>
</head>

<body>
  <button onclick="breeding()"> Breeding </button>
</body>

</html>

,

您如何在提取中使用此problem函数?

如果您在获取其总体正常值之外使用int,则您的数组将为空。

编辑:

在您发布fetch方法之后,您需要在填充数据时将所有while循环放到最后一个循环中,因为fetch是async = / 由于您有两次读取,并且两者都在填充数组,因此您需要在第一个then的最后一个fetch中进行第二个。最后,您可以在第二个while 的最后一个then中进行fetch循环。 使用异步等待方法可能会更清晰。

function par(idF,idM) {
    this.IDOvna = idM;
    this.IDOvce = idF;
}
  
  
  
function breeding() {
    let idOvce = [];
    let brOvce = [];
    let mesecOvce = [];
    let godinaOvce = [];
    let istorija1 = [];
    let istorija2 = [];

    let idOvna = [];
    let brOvna = [];
    let mesecOvna = [];
    let godinaOvna = [];

    let y = 0;
    let o = 0;
    let parovi = [];
    let c = 0;
    fetch("http://localhost/ovce/ovce.json")
    .then(function(resp) {
    return resp.json();
    })
    .then(function(data) {
    console.log(data);
    for (let i = 0; i < data.ovce.length; i++) {
        idOvce[i] = data.ovce[i].id;
        brOvce[i] = data.ovce[i].broj;
        mesecOvce[i] = data.ovce[i].mesec;
        godinaOvce[i] = data.ovce[i].godina;
        istorija1[i] = data.ovce[i].istorija1;
        istorija2[i] = data.ovce[i].istorija2;
    }

    fetch("http://localhost/ovce/ovnovi.json")
    .then(function(resp1) {
    return resp1.json();
    })
    .then(function(data1) {
        console.log(data1);
        for (let g = 0; g < data1.ovnovi.length; g++) {
            idOvna[g] = data1.ovnovi[g].id;
            brOvna[g] = data1.ovnovi[g].broj;
            mesecOvna[g] = data1.ovnovi[g].mesec;
            godinaOvna[g] = data1.ovnovi[g].godina;

            while (o < idOvna.length) {
            y = 0;
            while (y < idOvce.length) {
                if (istorija1[y] != 0) {
                if ((istorija2[y] != idOvna[o]) && (istorija2[istorija1[y]] != idOvna[o])) {
                    parovi[c] = new par(idOvce[y],idOvna[o]);
                    c++;
                }
                } else {
                parovi[c] = new par(idOvce[y],idOvna[o]);
                c++;
                }
                y++;
            }
            o++;
            }
            console.log(parovi);
            return parovi;
        }
        });
    });
    

}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。