2015-07-29 3 views
1

У меня есть следующий код:Как динамически создавать массивы внутри массивов с JavaScript

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"); 

Строка затем становится «ATATCGATCG». Пока что так. Каждая пара букв должна быть массивом, и каждый массив является элементом массива. Ожидаемый результат:

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

Но вместо этого я получаю этот результат:

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

Что такое ошибка в коде? Я несколько раз пытался найти ошибку, но мне это не удалось.

+0

может быть введенной строкой «TAGC ...» или это просто пара мудрый раскол. – archie

ответ

0

Я думаю, что нашел проблему. Короткий ответ заключается в том, что предел во внешнем цикле должен быть установлен до цикла.

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 ++) { 
... 

Причина заключается в том, что каждая операция сдвига во внутреннем цикле, уменьшает размер массива на один ул. Выражение 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']]

последний раз наружный для условия петлевого оценивали str.length 2 ==/2, в этой точке j == 2, так что цикл заканчивается.

MDN ссылка на для петель полезно: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for

+0

@brinquedo: рад помочь – dashaxiong

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; 
    } 
} 

Я довольно уверен, что решает вашу проблему чистым, читаемым способом.

+0

Несомненно, это в конечном итоге работает для вас? Если бы вы не заметили это как ответ? –