2013-11-15 5 views
0

Я написал этот пример кода, чтобы узнать положение индекса элемента, имеющего определенное значение в «Name». Мои данные переменных содержат список этих элементов.Сравнение двух строк в javascript не работает

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

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

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

+0

Ваш оператор 'return' возвращается из внутренней, анонимной функции, а не из функции' find_index'. – Barmar

ответ

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

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

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

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

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