【问题标题】:Read and insert data to arrays through loops通过循环读取数据并将数据插入数组
【发布时间】:2016-02-12 12:09:28
【问题描述】:

我正在尝试从 textarea 读取 CSV 数据,然后根据条件(如果它们通过或不通过)将它们推送到两个不同的数组中。我很挣扎,我理解为什么我的代码会多次插入数据(因为我的 for 循环,虽然我不知道如何解决这个问题)但我不知道为什么它将它们插入成功和失败的数组中。这是我迄今为止尝试过的 - 必须是纯 javascript - 请原谅我的命名不是很好的 atm:

var addValue = document.getElementById('example').value;
filter = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,
  num = /0{2,}|1{2,}|2{2,}|3{2,}|4{2,}|5{2,}/,
  cur = new Date(),
  abbr = ["PA", "CT", "NJ", "MA", "IL", "ID", "OR"],
  successArray = [];
failedArray = [];


if (addValue != "") {
  var CSVvalue = addValue.split(',');
  information.push(CSVvalue);
  for (var i = 0; i <= information.length - 1; i++) {
    for (var j = 0; j <= abbr.length - 1; j++) {
      var email = information[i][3],
        birthdate = new Date(information[i][2]),
        zipCode = information[i][5],
        diff = cur - birthdate,
        age = Math.floor(diff / 31536000000),
        state = information[i][4];


      if ((filter.test(email)) && (!num.test(zipCode)) && (age > 21) && ((state != abbr[j]))) {
        var lastSuccessArray = [];
        successArray.push(information);
        lastSuccessArray.push(successArray.slice(0));

      } else {
        var lastFailArray = [];
        failedArray.push(information);
        lastFailArray.push(failedArray.slice(0));
      }
    }
  }
} else {
  alert("You must enter a value");
}

【问题讨论】:

  • 请检查我的代码,让我知道你需要什么。

标签: javascript arrays for-loop


【解决方案1】:

就在推送成功数组检查之前

if ( failedArray.indexOf( information[i] ) == -1 )
 {
    successArray.push(information[i]);
 } 

对于失败的数组反之亦然

 if ( successArray.indexOf( information[i] ) == -1 )
 {
    failedArray.push(information[i]);
 } 

您的代码显然可以优化,但对于您而言,我们需要了解有关您的数组和逻辑的更多详细信息。

【讨论】:

  • 我真的不明白你在这里的情况想要达到什么,对不起,我在编码方面很新。所以我如何考虑这个问题是从 textarea 读取 CSV 数据,将它们插入“信息”数组,这样我就可以将数据与要求(有效的电子邮件、年龄、状态、邮政编码中的非重复数字)进行比较,然后如果它传递这些要求以将它们插入“成功”数组,否则插入“失败”数组。你认为我以错误的方式接近它?
  • @user2502490 我在这里要做的是,如果将此信息添加到一个数组(失败或成功),则不应将其添加到另一个数组,因为在阅读了您的问题后,它发生了我认为信息可以进入成功数组或失败数组。你是说即使值在成功数组中,它也可以添加到失败数组中?
  • 不,你说得对,如果它满足 if 条件,则应将其推入成功数组,否则推入失败数组,尽管您的解决方案不起作用,因为它不断将它们添加到两个数组中
  • @user2502490 刚刚再次检查了您的代码,应该是information[i] 而不是information
  • 非常感谢,它成功了!现在还有一个问题,我会给你一个例子,因为我认为更容易理解。如果我的第一个数据“a”被传递到成功数组中,它会被传递两次,那么其他所有数据都会被传递两次到该数组,但一次传递到失败的数组(反之亦然,失败的数组)
【解决方案2】:
var addValue = document.getElementById('example').value;
filter = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,
  num = /0{2,}|1{2,}|2{2,}|3{2,}|4{2,}|5{2,}/,
  cur = new Date(),
  abbr = ["PA", "CT", "NJ", "MA", "IL", "ID", "OR"],
  successArray = [];
failedArray = [];
var information = [];//use array information in here 


if (addValue != "") {
  var CSVvalue = addValue.split(',');
  information.push(CSVvalue);
  for (var i = 0; i <= information.length - 1; i++) {
    //no need of forloop 'j' using in here
      var email = information[i][3],
        birthdate = new Date(information[i][2]),
        zipCode = information[i][5],
        diff = cur - birthdate,
        age = Math.floor(diff / 31536000000),
        state = information[i][4];

      if ((filter.test(email)) && (!num.test(zipCode)) && (age > 21) && ((abbr.indexOf(state) == -1))) {
        var lastSuccessArray = [];
        successArray.push(information);
        lastSuccessArray.push(successArray.slice(0));

      } else {
        var lastFailArray = [];
        failedArray.push(information);
        lastFailArray.push(failedArray.slice(0));
      }

  }
} else {
  alert("You must enter a value");
}

不要使用 forloop abbr 这会将值推送到 abbr 的长度。所以改为使用abbr.indexOf(state) == -1

【讨论】:

  • 感谢您的回答。刚刚看到您对 abbr 循环的编辑(您的解决方案有效)现在我想继续添加数据而不每次都清空数组(例如,在 10 次尝试后,我希望在成功数组中添加“n”个条目和 10-n 个条目到失败的数组中)。
  • 是的,我删除了第二个 forloop。它不再需要了
  • 请给出您在 addValue 中得到的信息。基于此,我继续。
  • 例如:1,John,4/4/1980,john@mail.com,KY,75930
猜你喜欢
  • 1970-01-01
  • 2018-10-16
  • 2018-06-29
  • 2021-07-17
  • 2019-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多