Я написал этот пример кода, чтобы узнать позицию индекса элемента, который имеет определенное значение в "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, что является позицией элемента с именем "спальни".
Что здесь происходит? и как я могу его решить?
Вам нужно вернуть значение из вашей функции.
Пытаться
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"));
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"));
Каждая функция не останавливается (прерывается), если вы не вернете значение false. У вас может быть переменная, которой вы присваиваете соответствующий индекс, а затем возвращаете false.
return
оператор возвращает из внутренних, анонимных функций, а неfind_index
функции.