Сравнение между двумя строками в JavaScript не работает

0

Я написал этот пример кода, чтобы узнать позицию индекса элемента, который имеет определенное значение в "Name". Мои данные переменных содержат список этих элементов.

var data = {"Attributes":[
    {"Name":"bedrooms","Value":"4"},
    {"Name":"bathrooms","Value":"2"},
    {"Name":"property_type","Value":"House"},
    {"Name":"rateable_value","Value":"$780,000"},
    {"Name":"price","Value":"Price by negotiation"},
    {"Name":"location","Value":"13"},
    {"Name":"district","Value":"Queenstown-Lakes"},
    {"Name":"suburb","Value":"Lower Shotover"},
    {"Name":"region","Value":"Otago"},
    {"Name":"floor_area","Value":"254m²"},
    {"Name":"land_area","Value":"1690m²"},
    {"Name":"property_id","Value":"CBM959"},
    {"Name":"in_the_area","Value":"playground"},
    {"Name":"parking","Value":"Large double garage"}
]}

find_index = function(list, str){
        list.each(function(index, value){
            console.log("Comparing "+value.Name+" with "+str);
            if(value.Name == str){
                return index;
            }
        });
    };

console.log(find_index($(data.Attributes), "bedrooms"))

Когда я выполняю этот код, он печатает в журнале все сравнения, а затем возвращает "undefined". То, что я ожидал, это остановить итерации, когда сравнение было успешным, и вернуть 0, что является позицией элемента с именем "спальни".

Что здесь происходит? и как я могу его решить?

  • 0
    Ваше return оператор возвращает из внутренних, анонимных функций, а не find_index функции.
Теги:
string
arrays
comparison

3 ответа

3
Лучший ответ

Вам нужно вернуть значение из вашей функции.

Пытаться

find_index = function(list, str){
    var idx;
        list.each(function(index, value){
            console.log("Comparing "+value.Name+" with "+str);
            if(value.Name === str){
                idx = index;
                return false; //Exit out of the loop after the match
            }
        });
    return idx;
 };

Возвращаемое значение в цикле .each используется как логическое значение для выхода или продолжения цикла.

Также вам не нужно создавать объект jquery, вы можете просто использовать $.each для массивов, как это выглядит так:

find_index = function(list, str){
        var idx;
            $.each(list, function(index, value){
                 if(value.Name === str){
                    idx = index;
                    return false; //Exit out of the loop after the match
                }
            });
        return idx;
     };
console.log(find_index(data.Attributes, "bedrooms"));

Вы можете понять это намного лучше, особенно если вы хотите получить несколько матчей. Но нет возможности вырваться из карты:

find_index = function(list, str){
  return $.map(list, function(val, idx){
       if(val.Name === str) return idx;
   })[0]; //for multiple matches remove 0
};

console.log(find_index(data.Attributes, "district"));
1

Incase, сравнение строк не позволяет использовать localeCompare; это приходит в порядок, чтобы точно соответствовать строкам.

find_index = function(list, str){
var localIndex;
    list.each(function(index, value){
        console.log("Comparing "+value.Name+" with "+str + index);
        if(str.localeCompare(value.Name) == 0)
        {

            localIndex = index;
            return false;
        }

    });
    return localIndex;
};

console.log(find_index($(data.Attributes), "bedrooms"));
0

Каждая функция не останавливается (прерывается), если вы не вернете значение false. У вас может быть переменная, которой вы присваиваете соответствующий индекс, а затем возвращаете false.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню