2016-07-11 3 views
1

Мой вопрос касается цикла 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

Вы уверены, что «нижний» заселен? –

ответ

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 Спасибо, как сказал Энамул Хак в другом ответе, петля правильно зацикливается (если я правильно понимаю), она просто не толкалась должным образом. Добавление «if (lower [i + 1]! = Undefined») сделало его идеальным. Еще раз спасибо. –

+0

счастливое кодирование @Matthew Daly –

+0

Я не верю, что это дает желаемый результат. Учитывая ** [«Джейн», «Боб», «Боб», «Боб»] **, я считаю, что ожидаемый результат: ** [«Боб», «Боб», «Боб»] ** не ** [ «Боб», «Боб»] ** – JonSG

0

на основе дополнительных разговоров, обновленные требования кажутся:

Учитывая массив имен, например, [«Боб», «Джейн», ...], пересечь массив, сравнивающий последнюю букву элемента n с первой буквой элемента n + 1. Если они совпадают (регистр нечувствителен), оба элемента должны быть добавлены ко второму «массиву результатов». Ни один элемент (по индексу) не должен быть добавлен в массив результатов дважды, хотя в массиве результатов могут существовать повторяющиеся значения.

Use Case A:

Дано: [ "Buddy Bear", "Ромео", "Olive"]

Ожидать: [ "Buddy Bear", "Ромео", "Olive" ]

Use Case 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, я добавил некоторую документацию и обновил код, чтобы создать то, что, как я считаю, является ответом, которого вы ожидаете. Учитывая ** [«Джейн», «Боб», «Боб», «Боб»] **, ожидают ** [«Боб», «Боб», «Боб»] **. Только голова, ответ, который вы приняли, не дает правильного результата. – JonSG

+0

Я вижу, что вы говорите полностью, вы и гайатри работают на более высоком уровне, чем я. Дайте мне возможность просмотреть оба ответа. (Я должен помнить, что мой первоначальный вопрос был в том, почему мой цикл for не был правильно зациклен, следовательно, любой, кто ищет подобную проблему ...) Опять же, это может привести к неправильному объяснению моих целей. Дайте мне шанс подумать об этом, поскольку я хочу, чтобы самое подходящее решение было помечено. –

-1

Во-первых, добавить ";" в конце команды

var lower = [] 

↓↓↓

var lower = []; 

Во-вторых, результат записывается в массив, а затем вернуться.

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

Надеюсь, это поможет.

0

Ваш код абсолютно Ok

Loop не зацикливание 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

Отлично! Цикл правильно зацикливается, он находится в моем «if-push» коде, где проблема лежит. Это только толкает первую строку в моем массиве, но это цикл. Благодарю. –

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"])); 
Смежные вопросы