fiorentina.gf
fiorentina.gf

Reputation: 57

Why is my array is not processed?

I have array of 1000 values.

var city = city_str.split(',');

It is cities in alphabet order.

I have function which search first word who started in letters which is declared in the argument.

function searchWord(letter){
    letter = letter.toUpperCase();
    var letters = city.map(n => n[0]);
    var word = '';
    var flag = false;
    for (var i = 0; (i<= letters.length)&&(flag); i++){
        if (letter == letters[i]) {
            word = city[i];
            flag = true;
        }
    }
    if (word == '') {
        return 0;
    }
    else return word;
}

but always return 0. why?

Upvotes: 3

Views: 35

Answers (2)

T.J. Crowder
T.J. Crowder

Reputation: 1074168

Your for loop condition (i<= letters.length)&&(flag) is false right at the outset, because you've required that flag be true, but you've set flag to false just prior to the loop. Remember, && means "and".

You probably meant !flag. Also, notice that you want <, not <=, when comparing i to letters.length. So: i < letters.length && !flag

Also note that you don't need those parens, and can I respectfully suggest consistent use of {} and indentation. So:

function searchWord(letter){
    letter = letter.toUpperCase();
    var letters = city.map(n => n[0]);
    var word = '';
    var flag = false;
    for (var i = 0; !flag && i < letters.length; i++) {
        if (letter == letters[i]) {
            word = city[i];
            flag = true;
        }
    }
    if (word == '') {
        return 0;
    } else {
        return word;
    }
}

Or you could just return from within the loop and avoid flag (and word) entirely:

function searchWord(letter){
    letter = letter.toUpperCase();
    var letters = city.map(n => n[0]);
    for (var i = 0; i < letters.length; i++) {
        if (letter == letters[i]) {
            return city[i];
        }
    }
    return 0;
}

In fact, you can avoid for entirely, because if city is an array (I assume from map), you can use find:

function searchWord(letter){
    letter = letter.toUpperCase();
    return city.find(n => n[0] == letter) || 0;
}

find calls your callback repeatedly until it returns a truthy value or it runs out of entries. If your callback returns a truthy value, find's return value is the entry for which the callback did that; otherwise, it returns undefined. Since we know the word in city won't be falsy, we can safely use || 0 to convert that undefined to 0.

Upvotes: 1

amrender singh
amrender singh

Reputation: 8239

It is because your loop is not executing due to condition :

for (var i = 0; (i<= letters.length)&&(flag); i++)

flag is set to false. Therefor your loop will not execute.

Change this line to :

for (var i = 0; (i< letters.length)&&(!flag); i++)

Upvotes: 0

Related Questions