Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.07.2013, 19:51
Новичок на форуме
Отправить личное сообщение для loen Посмотреть профиль Найти все сообщения от loen
 
Регистрация: 02.04.2011
Сообщений: 4

Проблема преобразования ассоциативного массива в обычный
Здравствуйте. Есть такая проблема. В общем:
Есть сайт. На сайте находится <input type="text">. При вводе любой буквы в это поле работает автозаполнение(как в гугле). Для автозаполнения использую плагин jQuery UI.
Есть ассоциативный массив вида:
technics = {tv:'Телевизор',lcdtv:'LCD телевизор',plasmatv:'Plasma телевизор'};
Так вот, для использования этого ассоциативного массива как источник откуда будут браться варианты заполнения поля, для плагина требуется преобразовать его в обычный массив, где каждый элемент его это ассоциативный массив:
[ { label: "Лэйбл значения", value: "значение" }, ... ]
Для этого написал функцию:
function objToArray (obj) {
    var res = []; var tempobj = {};
    for (var key in obj) {
	tempobj.label = obj[key]; tempobj.value = key; 
        res.push(tempobj);
    }
    return res;
}
И вроде бы все должно работать, но вместо такого массива:
[ { label: "Телевизор", value: "tv" }, { label: "LCD Телевизор", value: "lcdtv" },{ label: "Plasma Телевизор", value: "plasmatv" }]
Функция возвращает мне такой массив:
[ { label: "Plasma Телевизор", value: "plasmatv" }, { label: "Plasma Телевизор", value: "plasmatv" }, { label: "Plasma Телевизор", value: "plasmatv" }]
То есть все элементы в новом массиве являются последним элементом ассоциативного массива.
Что я делаю не так?

Последний раз редактировалось loen, 07.07.2013 в 20:25.
Ответить с цитированием
  #2 (permalink)  
Старый 07.07.2013, 20:35
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Все верно. Ты заполняешь массив одним и тем же объектом. И нечего удивляться.

function objToArray (obj) {
    var res = [];
    for (var key in obj) {
        res.push({
            label: obj[key],
            value: key
        });
    }
    return res;
}
Ответить с цитированием
  #3 (permalink)  
Старый 07.07.2013, 20:47
Новичок на форуме
Отправить личное сообщение для loen Посмотреть профиль Найти все сообщения от loen
 
Регистрация: 02.04.2011
Сообщений: 4

Спасибо большое
p.s. я считал что на каждой итерации я присваиваю объекту tempobj текущий ключ и его значение, после чего измененый объект добавляется в массив, но все равно спасибо!
Ответить с цитированием
  #4 (permalink)  
Старый 07.07.2013, 20:52
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от loen
p.s. я считал что на каждой итерации я присваиваю объекту tempobj текущий ключ и его значение, после чего измененый объект добавляется в массив, но все равно спасибо!
Да, именно так. В том то и дело что добавляется не копия объекта, а сам объект (или лучше сказать - ссылка на объект). А затем ты изменяешь свойства этого объекта. Вот и результат. В моем же коде мы каждый раз создаем новый объект (описанный как литерал)
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с выводом изображений из массива bakmaks Events/DOM/Window 21 18.03.2013 13:42
Проблема с отбором чисел из массива mindkilla Общие вопросы Javascript 10 05.11.2012 10:03
Проблема с выводом массива на консоль Vempel jQuery 1 06.08.2012 14:57
Проблема с передачей массива ajax-ом maximale AJAX и COMET 1 11.02.2012 00:20
проблема с элементами массива Krinart Общие вопросы Javascript 3 05.09.2008 20:06