Как преобразовать объект в упорядоченный массив
Нужно преобразовать такой объект
{ ru: { pos:1, title:'Русский' }, en: { pos:3, title:'English' }, de: { pos:2, title:'Deutsch' } } В такой массив [ { code: 'ru', title:'Русский' },{ code: 'de', title:'Deutsch' },{ code: 'en', title:'English' }, ] Есть какой-нибудь элегантный способ? |
Shitbox2,
:-? var data = { ru: { pos:1, title:'Русский' }, en: { pos:3, title:'English' }, de: { pos:2, title:'Deutsch' } }, arr = [] ; Object.keys(data).forEach(function (key) { arr[data[key]['pos']-1]={code: key, title : data[key]['title']} }); alert(JSON.stringify(arr)) |
Мое решение было таким
var input = { ru: { pos:1, title:'Русский' }, en: { pos:3, title:'English' }, de: { pos:2, title:'Deutsch' } }; var output = []; for (key in input) { if (input.hasOwnProperty(key)) { output[input[key].pos - 1] = input[key]; output[input[key].pos - 1].code = key; delete output[input[key].pos - 1].pos; } } alert(JSON.stringify(output)); |
Shitbox2, ну и правильно. Оно и быстрее и логичнее.)
|
На правах рекламы :)
<html> <head> <script src="http://www.collection-js.com/files/collection/collection.min.js"></script> </head> <body><script> var result = $C({ ru: { pos: 1, title: 'Русский' }, en: { pos: 3, title: 'English' }, de: { pos: 2, title: 'Deutsch' } }).map(function (el, key) { return {code: key, title: el.title}; }, {initial: []}); alert(JSON.stringify(result)); </script></body> </html> |
kobezzza,
a pos где? |
Цитата:
|
kobezzza, ну да, сразу о том подумал.)
|
Цитата:
что во 2 и 3 постах? |
Цитата:
|
kobezzza, да нет же, от pos зависит позиция в массиве, так что тут надо хитрее делать.)
|
Цитата:
<html> <head> <script src="http://www.collection-js.com/files/collection/collection.min.js"></script> </head> <body><script> var result = $C({ ru: { pos: 1, title: 'Русский' }, en: { pos: 3, title: 'English' }, de: { pos: 2, title: 'Deutsch' } }).reduce(function (result, el, key) { result[el.pos - 1] = {code: key, title: el.title}; return result; }, []); alert(JSON.stringify(result)); </script></body> </html> |
kobezzza,
ок уже ок |
Все делают через result[el.pos - 1]. Для этого примера это ОК, но если мы будем добавлять позиции асинхронно, или номер позиции окажется не числом, то в массиве появятся дыры.
Как сделать, чтобы эти ситуации тоже предусматривались? |
Shitbox2,
:) var data = { ru: { pos:1, title:'Русский' }, en: { pos:3, title:'English' }, de: { pos:2, title:'Deutsch' } }, arr = [] ; Object.keys(data).forEach(function (key) { arr.push({code: key, title : data[key]['title'],pos : data[key]['pos']}) }); arr.sort(function (a, b) { return a.pos - b.pos }) alert(JSON.stringify(arr)) |
Цитата:
<html> <head> <script src="http://www.collection-js.com/files/collection/collection.min.js"></script> </head> <body><script> var result = $C({ ru: { pos: 'ha ha ha!!!', title: 'Русский' }, en: { pos: 30, title: 'English' }, de: { pos: 2, title: 'Deutsch' } }).reduce(function (result, el, key, data, i, length) { if (!isNaN(Number(el.pos))) { result[el.pos - 1] = {code: key, title: el.title}; } if (i !== length() - 1) { return result; } return $C(result).filter(function (el) { return el !== void 0; }); }, []); alert(JSON.stringify(result)); </script></body> </html> |
Часовой пояс GMT +3, время: 14:31. |