Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как преобразовать объект в упорядоченный массив (https://javascript.ru/forum/misc/47830-kak-preobrazovat-obekt-v-uporyadochennyjj-massiv.html)

Shitbox2 09.06.2014 14:13

Как преобразовать объект в упорядоченный массив
 
Нужно преобразовать такой объект
{
  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'
  },
]


Есть какой-нибудь элегантный способ?

рони 09.06.2014 14:21

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))

Shitbox2 09.06.2014 14:28

Мое решение было таким

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));

Aetae 09.06.2014 16:35

Shitbox2, ну и правильно. Оно и быстрее и логичнее.)

kobezzza 09.06.2014 16:50

На правах рекламы :)

<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>

рони 09.06.2014 16:59

kobezzza,
a pos где?

kobezzza 09.06.2014 17:00

Цитата:

Сообщение от рони (Сообщение 315751)
kobezzza,
a pos где?

Дык, ТС же написал, что ему он не нужен в элементах массива. Ну и не суть, думаю всем очевидно, как вставить туда pos :)

Aetae 09.06.2014 17:06

kobezzza, ну да, сразу о том подумал.)

рони 09.06.2014 17:09

Цитата:

Сообщение от kobezzza
думаю всем очевидно, как вставить туда pos

мне непонятно - можно пример чтоб ваш код выдал тоже
что во 2 и 3 постах?

kobezzza 09.06.2014 17:17

Цитата:

Сообщение от рони (Сообщение 315755)
мне непонятно - можно пример чтоб ваш код выдал тоже
что во 2 и 3 постах?

Он и так выдаёт такой же результат. Сделал пример запускаемым.

Aetae 09.06.2014 17:22

kobezzza, да нет же, от pos зависит позиция в массиве, так что тут надо хитрее делать.)

kobezzza 09.06.2014 17:26

Цитата:

Сообщение от Aetae (Сообщение 315760)
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>

рони 09.06.2014 17:47

kobezzza,
ок уже ок

Shitbox2 09.06.2014 18:02

Все делают через result[el.pos - 1]. Для этого примера это ОК, но если мы будем добавлять позиции асинхронно, или номер позиции окажется не числом, то в массиве появятся дыры.

Как сделать, чтобы эти ситуации тоже предусматривались?

рони 09.06.2014 18:16

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))

kobezzza 09.06.2014 18:23

Цитата:

или номер позиции окажется не числом, то в массиве появятся дыры.
<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.