JavaScript for loop confusion

时间:2016-03-03 00:14:41

标签: javascript arrays object for-loop

我正在编写我认为简单的循环,但它的表现并不像我想要的那样。我想明白为什么它正在做它正在做的事情:

function pair(str) {

  var finalArray = [];
  var pushArray  = [];
  
  var lookup = {
    G: "C",
    C: "G",
    A: "T",
    T: "A"
  };
  
  for (i=0; i<str.length; i++) {
    pushArray[0] = str[i];
    pushArray[1] = lookup[str[i]];
    finalArray.push(pushArray);
  }
  return finalArray;
}

pair("ATCGG");

我希望它返回[[“A”,“T”],[“T”,“A”],[“C”,“G”],[“G”,“C”],[ “G”, “C”]]

我实际得到的是[[“G”,“C”],[“G”,“C”],[“G”,“C”],[“G”,“C”] [ “G”, “C”]]

似乎所有[“G”,“C”]都是针对i = 4的地方。为什么我的代码没有循环?我错过了什么?

6 个答案:

答案 0 :(得分:5)

问题是option_dashboard没有制作finalArray.push(pushArray)的副本。每次执行此操作时,您都会将引用推送到同一个数组,然后在下一次迭代时对其进行修改。您需要每次都创建一个新数组。

&#13;
&#13;
pushArray
&#13;
&#13;
&#13;

答案 1 :(得分:3)

这应该可以帮助你:)

&#13;
&#13;
function pair(str) {      
  var lookup = {
    G: 'C',
    C: 'G',
    A: 'T',
    T: 'A'
  };
  return str.split('').reduce(function(ys,x) {
    return ys.concat([[x, lookup[x]]]);
  }, []);
}

var result = pair('ATCGG');
console.log(JSON.stringify(result));
// [["A","T"],["T","A"],["C","G"],["G","C"],["G","C"]]
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您的假设是部分正确的,除非您每次推送对同一变量的引用。

这应该有效:

function pair(str) {

  var finalArray = [];


  var lookup = {
    G: "C",
    C: "G",
    A: "T",
    T: "A"
  };

  for (i=0; i<str.length; i++) {
  var pushArray=[];
    pushArray[0] = str[i];
    pushArray[1] = lookup[str[i]];
    finalArray.push(pushArray);
  }
  console.log(finalArray.toString())
  return finalArray;
}

pair("ATCGG");

<强> Fiddle

答案 3 :(得分:0)

在你的代码中,pushArray是一个单实例对象,每次在for循环中都会用新值写入。 您可以为每个str-lookup对创建单独的对象实例,以修改您的代码,如下所示。

function pair(str) {

  var finalArray = [];
  
  var lookup = {
    G: "C",
    C: "G",
    A: "T",
    T: "A"
  };
  
  for (i=0; i<str.length; i++) {
    finalArray.push([ str[i], lookup[str[i]] ]);
  }
  return finalArray;
}

var res = pair("ATCGG");
alert(JSON.stringify(res));

希望这对你有所帮助。

答案 4 :(得分:0)

只需替换它:

finalArray.push(pushArray);

有了这个:

finalArray = finalArray.concat(pushArray);

答案 5 :(得分:0)

试试这个 - 注意原始帖子是确定DNA代码中的碱基对序列。我提供以下内容。具有碱基阵列(在OP中查找)的关键是知道每个遗传碱基只能与预定的其他碱基配对以给出以下组合(G-C,C-G,A-T,T-A)。因此,可以简化基本数组,然后迭代通过传递的字符串,在基数组中找到该特定碱基的第一个索引并将其与下一个匹配(以形成碱基对)。然后将该对推入DNA序列阵列。请注意,我是“console.logging”它 - 以证明这是有效的 - 而不是使用“return”。

即使在编程中,遗传学知识也很有用:)

pair("ATCGG");

function pair(str) {
  var DNAsequence = [];
  var bases = ["G","C","G","A","T","A"];

  for (i=0; i<str.length; i++) {
      var firstBase=bases.indexOf(str[i]);
      var secondBase=firstBase+1;
      var basePair=[bases[firstBase],bases[secondBase]];

    DNAsequence.push(basePair);
  }
  console.log( DNAsequence);
}

并且console.log按要求显示以下内容:

[["A","T"], ["T","A"], ["C","G"], ["G","C"], ["G","C"]]