2016-07-11 280 views
1

我的問題是關於for循環似乎只循環一次,我不知道爲什麼。for循環只循環一次

我正在寫一個函數比較數組元素的最後一個字母與下一個數組元素的第一個字母。

我的測試輸入是數組:[「好友熊」,「羅密歐」,「橄欖」]。這些都符合條件(匹配下一個首字母的最後一個字母),並且應該推入數組中。

我讀過關於該主題的所有帖子,但找不到似乎符合我的問題的帖子。我知道我錯過了一些簡單的東西,只是看不到它。

小提琴:https://jsfiddle.net/qwL8hq3j/

function validName(array){ 
var lower = [] 
for(let i = 0; i < array.length; i++){ 
    lower.push(array[i].toLowerCase()); 
} 
var testA = [] 
var count = 0; 

for(var i = 0; i < lower.length; i++) { 
    var j = 1; 
    if(lower[i].charAt(lower[i].length-1) === lower[j].charAt(0)){ 
     testA.push(lower[i]); 
     j = j + 1; 
     count = count + 1; 
    } 
    } 
    return count; 
} 

我把一個計數器,以確保代碼是騎自行車和它返回1,使我得出這樣的結論,只有通過一個時間循環。我也嘗試過重新配置代碼幾次,但我不確定哪裏出錯。

+3

不要隨便給功能小提琴。用參數運行該函數,明確發生了什麼問題。 –

+1

您是否有我們可以看到的輸入和預期輸出? – JonSG

+0

您確定正在填充「lower」嗎? –

回答

1
var array = ["heehjko", "oient", "ana", "inm", "mii", "dgdgdfg", "Dove"] 

var lower = [] 
for (let i = 0; i < array.length; i++) { 
    lower.push(array[i].toLowerCase()); 
} 
console.log(lower) 
var testA = [] 
var count = 0; 

for (var i = 0; i < lower.length; i++) { 
    var j = 1; 
    console.log(lower[i].charAt(lower[i].length - 1)) 
    console.log(lower[i + 1]) 
    if (lower[i + 1] != undefined) { 
     if (lower[i].charAt(lower[i].length - 1) === lower[i + 1].charAt(0)) { 

      testA.push(lower[i + 1]); 
     } 
    } 

} 
console.log(testA) 
+0

@gayathir謝謝你,正如Enamul Haque在另一個答案中指出的那樣,循環正確循環(如果我理解正確的話)它只是不能正確推動。添加「if(lower [i + 1]!= undefined)」使其完美工作。再次感謝。 –

+0

快樂編碼@Matthew Daly –

+0

我不相信這會產生所需的結果。鑑於** [「簡」,「鮑勃」,「鮑勃」,「鮑勃」] **,我相信預期的結果是** [「鮑勃」,「鮑勃」,「鮑勃」] **沒有** [ 「Bob」,「Bob」] ** – JonSG

0

基於額外的對話,更新的要求似乎是:

鑑於名稱的數組例如[「Bob」,「Jane」,...],遍歷將元素n的最後一個字母與元素n + 1的第一個字母進行比較的陣列。如果它們匹配(不區分大小寫),則應將這兩個元素添加到第二個「結果數組」中。儘管重複值可能存在於結果數組中,但應該將兩個元素(按索引)都添加到結果數組中。

用例A:

考慮:[ 「巴迪熊」, 「羅密歐」, 「橄欖樹」]

期待:[ 「巴迪熊」, 「羅密歐」, 「橄欖樹」 ]

使用案例B:

考慮:[ 「簡」, 「鮑勃」, 「鮑勃」, 「鮑勃」]

期望值:[ 「鮑勃」, 「鮑勃」, 「鮑勃」]

function validName(nameList){ 
 
    
 
    function _reducer(acc, item, index, arr){ 
 
    var nextIndex = index + 1; 
 
    var nextItem = arr[nextIndex]; 
 
    if (!nextItem){ return acc; } 
 

 
    var charA = item.charAt(item.length -1).toLowerCase(); 
 
    var charB = nextItem.charAt(0).toLowerCase(); 
 
    if (charA !== charB){ return acc; } 
 

 
    // ------------------- 
 
    // Add "item" to the accumulator if it was not already 
 
    // added in the previous itteration as "nextItem". 
 
    // ------------------- 
 
    if (acc[acc.length -1] !== index){ acc.push(index); } 
 
    // ------------------- 
 

 
    // ------------------- 
 
    // Add "nextItem" to the accumulator. 
 
    // ------------------- 
 
    acc.push(nextIndex); 
 
    // ------------------- 
 

 
    return acc; 
 
    } 
 

 
    // ------------------- 
 
    // Convert the array of indices into an array of values 
 
    // ------------------- 
 
    function _mapper(item){ return nameList[item]; } 
 
    // ------------------- 
 
    
 
    var result = nameList.reduce(_reducer, []).map(_mapper); 
 
    return result; 
 
} 
 

 
var nameList = ["Buddy Bear", "Romeo", "Olive"]; 
 
var result = validName(nameList); 
 
console.log("CASE A: "); 
 
console.log("Given: "); 
 
console.log(nameList); 
 
console.log("Result Count = " + result.length); 
 
console.log(result); 
 

 
console.log(""); 
 
console.log(""); 
 

 
nameList = ["Jane", "Bob", "Bob", "Bob"]; 
 
result = validName(nameList); 
 
console.log("CASE B: "); 
 
console.log("Given: "); 
 
console.log(nameList); 
 
console.log("Result Count = " + result.length); 
 
console.log(result);

+0

感謝您提供優秀的代碼示例。我將重新編輯我的問題,以便更清楚。 –

+0

@MatthewDaly,我添加了一些文檔並更新了代碼,以產生我認爲是您所期望的答案。給定** [「Jane」,「Bob」,「Bob」,「Bob」] **,期望** [「Bob」,「Bob」,「Bob」] **。只是站起來,你接受的答案不會產生正確的結果。 – JonSG

+0

我明白你在說什麼,你和gayathri正在比我更高的水平上工作。給我一個機會來回顧兩個答案。 (我必須記住,我最初的問題是爲什麼我的for循環沒有正確循環,因此任何人都在尋找類似的問題......)再一次,它可能歸結於我錯誤地解釋我的目標。給我一個機會來思考這個問題,因爲我確實需要標記最合適的解決方案。 –

-1

首先,添加 「;」在命令

的端
var lower = [] 

↓↓↓

var lower = []; 

其次,分配結果到數組,然後返回。

for(var i = 0; i < lower.length; i++) { 
    ... 
    arr_result.push(count); 
} 
return arr_result; 

希望它有幫助。

0

您的代碼絕對OK

循環未循環1次。它作爲循環和lower.length是lower.length 3 你如果條件

if(lower[i].charAt(lower[i].length-1) === lower[j].charAt(0)) 

是獲得真正的一次。這樣你的計數器的值返回1.如果設置了計數器,如果條件你會看到它的外面

for(var i = 0; i < lower.length; i++) { 
var j = 1; 
if(lower[i].charAt(lower[i].length-1) === lower[j].charAt(0)){ 
    testA.push(lower[i]); 
    j = j + 1; 

} 
count = count + 1; 
} 
return count; 
+0

完美!循環正確循環,這是在我的「如果 - 推」代碼是問題所在。它只是推動我的數組中的第一個字符串,但它是循環。謝謝。 –

0

此代碼似乎正常工作與我:

function validName(array){ 
    var result=[],lower=[],count=0,len=0; 
    for(i in array){ 
    lower.push(array[i].toLowerCase()); 
    } 
    for(j in lower){ 
    i=j;i++;if(j==lower.length-1){break;} 
    len=lower[j].length-1; 
    var u=lower[j].charAt(len); 
    var l=lower[i].charAt(0); 
    if(u==l){ 
     result.push(lower[j]); 
     count++; 
    } 
    } 
    return result; 
} 
alert(validName(["Buddy Bear","Romeo", "Olive"]));