#javascript #jquery #arrays #hash #autocomplete
#javascript #jquery #массивы #хэш #автозаполнение
Вопрос:
Я использую плагин автозаполнения jQuery, собычными данными, хранящимися в массиве:
data = [city1, city2, city3, city1]
Как только пользователь выбирает элемент данных, например city 1
, я сохраняю его в user_input
. Я использую пользовательский ввод для чтения хэша, который содержит город, почтовый индекс штата и название. Скрипт отображает каждый элемент хэша на экране, когда пользователь нажимает enter. Это также отлично работает:
$(document).keypress(function(e) {
if(e.keyCode == 13) {
var user_input = $("input#example").val()
$.each(personinfo,function(key,value){
if(value['city']== user_input){
$('#city').empty().append(value['city']);
$('#state').empty().append(value['state']);
$('#zip').empty().append(value['zip']);
$('#name').empty().append(value['name']);
}
})
Проблема возникает, когда есть два идентичных ключа. Например, произнесите имя "John Doe"
и "Jane Doe"
, живите в одном городе: city1
. Поэтому city1
появляется дважды в массиве данных, как вы видите выше.
data
определяется в этом методе:
var data = new Array();
$(document).ready(function(){
$.each(personinfo,function(key,value){
myarray.push(value['city'])
});
});
Как я могу различать city1 и city1 в приведенном выше массиве в функции нажатия клавиши?
Объект personinfo map:
{"address":"07288 Albertha Station","city":"Littelside","created_at":"2011-05-25T19:24:51Z","id":1,"name":"Jane Doe","state":"Missouri","updated_at":"2011-05-26T21:25:54Z","zip":"75475-9938"},{OBJECT 2}, {OBJECT 3}, ....
Комментарии:
1. Решение состоит в том, чтобы не использовать город в качестве отличительного признака. Что
key
в вашейpersoninfo
карте?2. Я включил хэш-объект, который я анализирую.
3. Подождите, это не имеет никакого смысла. Вы хотите выбрать из city1, city2, city и city1. В чем реальная проблема? Почему вы хотите проводить различие между city1 и city1 (которые не различимы)? Можете ли вы проиллюстрировать проблему на jsbin.com ?
4. Я не могу заставить его работать на jsbin, потому что я полагаюсь на плагин автозаполнения. На самом деле это простая проблема. Когда вы выбираете city1 в двух отдельных экземплярах, вы получаете тот же результат. Даже если, например, city1 — это Спрингфилд. Это может быть Спрингфилд, Калифорния или Нью-Йорк — приведенный выше код всегда возвращает один и тот же результат, Нью-Йорк.
5. данные — это массив возможностей, который используется в качестве данных для плагина автозаполнения (см. Ссылку)
Ответ №1:
Как следует из некоторых комментариев, проблему невозможно устранить с помощью идентичных ключей: единственный способ исправить это — использовать неидентичные ключи 🙂
Я бы просто объединил город и штат, чтобы создать ключ; похоже, это должно дать вам уникальный набор ключей.
Ответ №2:
Вероятно, уже поздно, но мне просто нужно было исправить эту проблему в подобном плагине, и лучший способ сделать это — передать дополнительную ссылку с данными поиска.
Как в lookup = { data: ['name1', 'name2', 'name2', 'namex'], ref:[1,2,3,4] }
Так что, когда пользователь выбирает второе ‘name2’, плагин вернет выбранное ‘name2’ и ссылку 3. Это зависит от плагина, поддерживает ли он эту функциональность, но даже если это не так, вы должны иметь возможность слегка ее модифицировать.