Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Перевод объекта в массив (https://javascript.ru/forum/misc/55668-perevod-obekta-v-massiv.html)

Valentin1918 08.05.2015 22:06

Перевод объекта в массив
 
У меня есть объект:
var myObj = {key1: "value1", key2: "value2", key3: "value3"};
Подскажите, как его перевести в массив :
["key1":"value1","key2":"value2","key3":"value3 "]

Спасибо!

Vlasenko Fedor 08.05.2015 22:22

if (!Object.keys) Object.keys = function (o) {
    if (o !== Object(o))
        throw new TypeError('Object.keys called on a non-object');
    var k = [],  p;
    for (p in o) if (Object.prototype.hasOwnProperty.call(o, p)) k.push(p);
    return k;
}
var myObj = {key1: "value1", key2: "value2", key3: "value3"};
var result = [], i;
var keys = Object.keys(myObj);
for (i = 0; i < keys.length; i++) {
    result.push(keys[i] + ":" + myObj[keys[i]]);
}
alert(result);

вариант

Valentin1918 08.05.2015 22:35

Спасибо, а что-то по проще? (я уверен можно уложиться в пару строк)

Vlasenko Fedor 08.05.2015 22:47

Вариант2 :)
var myObj = {key1: "value1", key2: "value2", key3: "value3"};
var result = [], p;
for (p in myObj) if (myObj.hasOwnProperty(p))result.push(p + ":" + myObj[p]);
alert(result);

первый быстрее в современных броузерах то будет

Valentin1918 08.05.2015 22:51

Спасибо большое :)

Valentin1918 08.05.2015 22:59

Еще уточнение, у нас получилось:
["key1:value1", "key2:value2", "key3:value3"]
а можно ли , и имеет ли смысл делать такой массив:
["key1":"value1","key2":"value2","key3":"value3 "] ?

laimas 08.05.2015 23:01

["key1":"value1","key2":"value2","key3":"value3 "] - такого массива быть не может, а переводить объект в массив ["key1:value1", "key2:value2", "key3:value3"] не имеет смысла.

Vlasenko Fedor 08.05.2015 23:02

если честно, не зная задачи не смогу сказать
2 варианта строка, а кавычки зачем не скажу
надо понимать для чего это делается. Может и объект тогда подойдет :)

Valentin1918 08.05.2015 23:07

Причин нет -- просто попросили такое сделать.
Ладно, спасибо!

laimas 08.05.2015 23:12

Можно использовать массив массивов, в котором первый массив, это ключи, а второй их значения, если по каким либо причинам это будет удобнее объекта. А вот ассоциативных массивов в JS нет.

sexbot 09.05.2015 14:43

Цитата:

Сообщение от laimas (Сообщение 369985)
Можно использовать массив массивов, в котором первый массив, это ключи, а второй их значения, если по каким либо причинам это будет удобнее объекта. А вот ассоциативных массивов в JS нет.

Не помню у Кнута чтоли было, что объект можно представить как ассоциативный массив, т.е. верно и обратное что объект - это ассоциативный массив, где ключи числа или строки, а значения другие объекты. Ты пытаешься сериализовать объект для его сохранения, это делается с помощью JSON.stringify(obj)

laimas 09.05.2015 15:15

Я ничего не пытаюсь, а насчет терминов, ну так и кушетку можно назвать диваном. )

drDocument 11.05.2015 13:59

Цитата:

Сообщение от laimas
такого массива быть не может

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

UPD Впрочем, смысл, таки, есть. Такая структура автоматически апдейтит свою длину. Мы получаем нечто вроде HTML-коллекции, только лучше.
transform=function(src){
 var arr=[]; for(var i in src){if(!src.hasOwnProperty(i)) return arr;
 arr[i]=src[i]} return arr}
 
arr=transform({foo: "bar", baz: "foo"})
ob={foo: "bar", length: 0}
arr[0]="foo"
ob[0]="foo"
console.log(arr, arr.length, arr.baz, ob.length)
arr.forEach(function(x){console.log(x)})

// ::: [ 'foo', foo: 'bar', baz: 'foo' ] 1 'foo' 0
// ::: foo

drDocument 11.05.2015 14:32

Цитата:

Сообщение от sexbot
Не помню у Кнута чтоли было, что объект можно представить как ассоциативный массив, т.е. верно и обратное что объект - это ассоциативный массив, где ключи числа или строки, а значения другие объекты.

Это не справедливо для js в общем случае. Если трактовать объект как карту, хеш и т.д., то да, но в Ъ-ООП языках объект -- это гораздо более абстрактное понятие, абстракция объекта ближе к понятию "интерфейс". А так-то да, можно, Кнут капитан, оказывается.


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