Javascript-форум (https://javascript.ru/forum/)
-   Events/DOM/Window (https://javascript.ru/forum/events/)
-   -   Проблема преобразования ассоциативного массива в обычный (https://javascript.ru/forum/events/39667-problema-preobrazovaniya-associativnogo-massiva-v-obychnyjj.html)

loen 07.07.2013 19:51

Проблема преобразования ассоциативного массива в обычный
 
Здравствуйте. Есть такая проблема. В общем:
Есть сайт. На сайте находится <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" }]
То есть все элементы в новом массиве являются последним элементом ассоциативного массива.
Что я делаю не так?:)

danik.js 07.07.2013 20:35

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

function objToArray (obj) {
    var res = [];
    for (var key in obj) {
        res.push({
            label: obj[key],
            value: key
        });
    }
    return res;
}

loen 07.07.2013 20:47

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

danik.js 07.07.2013 20:52

Цитата:

Сообщение от loen
p.s. я считал что на каждой итерации я присваиваю объекту tempobj текущий ключ и его значение, после чего измененый объект добавляется в массив, но все равно спасибо!

Да, именно так. В том то и дело что добавляется не копия объекта, а сам объект (или лучше сказать - ссылка на объект). А затем ты изменяешь свойства этого объекта. Вот и результат. В моем же коде мы каждый раз создаем новый объект (описанный как литерал)


Часовой пояс GMT +3, время: 04:11.