How to dynamically create arrays within arrays with JavaScript

时间:2015-07-29 00:30:13

标签: javascript arrays

I have the following code:

import numpy as np

def mean_if_no_missings(x, no_missings=3):
    if np.isnan(x).sum() < no_missings:
        return np.mean(x)
    else:
        return np.NaN

df['SCORE']=df.ix['Q1':'Q10'].apply(conditional_mean, axis=1)

The string then becomes "ATATCGATCG". So far so goood. Each letter pair should be an array, and each array is an array item. The expected result is:

function pair(str) {

  // This function checks whether there
  // a certain letter in a string and checks
  // if it is followed or follows a specific
  // letter.

  for (var i = 0; i < str.length; i++) {

    // If the letter isn't the letter "C"
    // before the "G", then it'll placed before it.

    if (str[i] == 'G' && str[i - 1] != 'C') {
      str = str.slice(0, i) + 'C' + str.slice(i);

    // The same goes for "A" and "T".
    } else if (str[i] == 'T' && str[i - 1] != 'A') {
      str = str.slice(0, i) + 'A' + str.slice(i);

    // And so on.
    } else if (str[i] == 'C' && str[i + 1] != 'G') {
      str = str.slice(0, i + 1) + 'G' + str.slice(i + 1);
    } else if (str[i] == 'A' && str[i + 1] != 'T') {
      str = str.slice(0, i + 1) + 'T' + str.slice(i + 1);
    }
  }

  str = str.split('');

  var temp = [];
  for (var j = 0; j <= str.length / 2; j++) {
    temp.push([]);
    for (var k = 0; k < 2; k++) {
      temp[j].push(str.shift());
    }
  }
  return temp;

}

pair("TTGAG");

But instead I get this result:

// > [ ['A', 'T'], ['A', 'T'], ['C', 'G'], ['A', 'T'], ['C', 'G'] ]

What is the mistake in the code? I tried several times to find the error but I haven't succeeded.

2 个答案:

答案 0 :(得分:0)

我想我发现了这个问题。简短的回答是需要在循环之前设置外部for循环的限制。

var limit = str.length / 2 -1;
for (var j = 0; j <= limit; j++) {
...

var limit = str.length / 2;
for (var j = 0; j < limit; j ++) {
...

原因是内循环中的每个移位操作都将str数组的大小减小了一个。 j <= str.length /2表达式在每个循环开始时进行评估 - 在前一个内循环上进行两次移位操作之后。

最初str.length / 2 == 5; temp == [['A', 'T']]

然后经过两次轮班操作str.length / 2 == 4; temp == [['A', 'T']['A','T']]

再进行两次轮班操作str.length /2 == 3; temp == [['A','T']['A','T']['C','G']]

外部for循环条件的最后时间被评估为str.length / 2 == 2,此时j == 2所以循环结束。

for循环的MDN参考很有用:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for

答案 1 :(得分:0)

如果我正确理解您的问题,您尝试使用"TTGAG"之类的输入字符串,并将其转换为[A,T][C,G]的数组。

这是我要采取的方法。

// renamed pair function for clarity
// assume genes == 'TTGAG'
function GeneStringToArray(genes){
    var geneSplit = genes.split(''); // [T,T,G,A,G]

    for(var i = 0; i < geneSplit.length; i += 1){
        geneSplit[i] = getGenePair(geneSplit[i]);      
    }

    return geneSplit; // out: [['A','T'],['A','T'],['C','G'],['A','T'],['C','G']]
}    


function getGenePair(gene) {
    // force lower case for ease of comparison
    char = char.toLowerCase();

    // Define our results
    var at = ['A', 'T'];
    var cg = ['C','G'];

    if(gene === 'a' || gene === 't'){
        return at;
    }

    if(gene === 'c' || gene === 'g'){
        return cg;
    }
}

我非常有信心以干净,可读的方式解决您的问题。

相关问题