Конвертировать массив объектов JavaScript в формат JSON

0

У меня есть набор данных в формате:

[{"title":movietitle1, "id":445, "release":"16JUN1985"}, {"title":movietitle2, "id":487, "release":"12AUG1993"}]

Который мне нужно преобразовать в JSON, отформатированный как таковой:

{ "movietitle1":{"id":445,"release":"16JUN1985"}, "movietitle2":{"id":487, "release":"12AUG1993"} }

Я не знаю, как это сделать.

  • 0
    Я рекомендую прочитать один из множества уроков по javascript, чтобы научиться делать это.
  • 1
    Формат, который у вас сейчас есть, намного полезнее. Тем не менее, вы должны попробовать, прежде чем спросить.
Показать ещё 1 комментарий
Теги:
object
arrays

3 ответа

2
Лучший ответ

Вы можете сделать это с помощью JSON.stringify() и некоторых основных манипуляций с данными.

Храните данные в переменной, input_data ее input_data.

Пронумеруйте свои данные и используйте каждую запись для создания другой переменной, позвоните ей output_data.

// create an object to store the newly formatted data
var output_data = {};
// the code in here is run once for each item in input_data
for (var i = 0; i < input_data.length; i++) {
  // get the current item title
  var title = input_data[i].title;
  // use the title as the key in the output data
  //  and assign the other values to that key
  output_data[title] = {
    id: input_data[i].id,
    release: input_data[i].release
  };
} 

// use JSON.stringify() to make a valid JSON string
var json = JSON.stringify(output_data);

// now use the variable json which contains your JSON string
  • 0
    «Минимизируйте количество переменных. Встроенные переменные, которые используются только один раз. Воспользуйтесь преимуществами циклов foreach». Спартанское программирование
  • 0
    У вас был смысл с этим? Я вижу, вы предложили использовать подчеркивание. Вы понимаете, что функция map подчеркивания также должна создавать переменную внутренне ... То, что вы не создаете переменную, не означает, что ваш код более эффективен. Кроме того, сделать одну переменную для вывода и другую для итератора вместо загрузки всей библиотеки? давай ... Это очень скудно и эффективно по сравнению с этим.
Показать ещё 3 комментария
0

То, о чем вы просите, состоит в том, чтобы превратить массив в карту, используя конкретное свойство. Если вы действительно хотите JSON, вы можете просто вызвать JSON.stringify на результирующем объекте JS.

http://jsfiddle.net/FfE8f/1/

/**
 * Given an array and a property name to key by, returns a map that is keyed by each array element chosen property
 * This method supports nested lists
 * Sample input: list = [{a: 1, b:2}, {a:5, b:7}, [{a:8, b:6}, {a:7, b:7}]]; prop = 'a'
 * Sample output: {'1': {a: 1, b:2}, '5': {a:5, b:7}, '8': {a:8, b:6}, '7':{a:7, b:7}}
 * @param {object[]} list of objects to be transformed into a keyed object
 * @param {string} keyByProp The name of the property to key by
 * @return {object} Map keyed by the given property values
 */
function mapFromArray (list , keyByProp) {
  var map = {};
  for (var i=0, item; item = list[i]; i++) {
    if (item instanceof Array) {
      // Ext.apply just copies all properties from one object to another,
      // you'll have to use something else. this is only required to support nested arrays.
      Ext.apply(map, mapFromArray(item, keyByProp));
    } else {
      map[item[keyByProp]] = item;
    }
  }
  return map;
};

console.log(mapFromArray([
    {"title": "title 1", "id":445, "release":"16JUN1985"}, 
    {"title":"movietitle2", "id":487, "release":"12AUG1993"}],
    "title"
)));
// outputs
{
    "title 1": {"title":"title 1","id":445,"release":"16JUN1985"},
    "movietitle2": {"title":"movietitle2","id":487,"release":"12AUG1993"}
} 

См. Более эффективный способ поиска массива объектов javascript?

  • 0
    Это выглядит сложно. Может быть, forEach может помочь упростить это? Это работает, просто чувствует себя немного "там драконы" - иш. Также где определяется Ext ?
  • 0
    @Sukima Ext - библиотека, которую я использую, в комментариях говорится, что вы должны написать свою собственную, если вам нужно поддерживать вложенные массивы. Что вам трудно понять?
0

Ваши условия смешивания. Я предполагаю, что вы спрашиваете об управлении данными с объектами JavaScript, а не строками с данными JSON. (Более поздняя JSON.parse может быть преобразована с помощью JSON.parse).

Сначала перебираем массив и присваиваем объект. Этот вид обработки данных хорошо работает с помощью Underscore, проверьте его.

В vanilla JS позволяет попробовать что-то вроде этого:

var newData = {};
data.forEach(function(item) {
  var title = item.title;
  delete item.title;
  newData[title] = item;
});

Немного круто, но выполняет свою работу.

Лично я бы использовал эту версию Underscore:

var newData = _(data).chain()
  .map(function(item) {
    return [item.title, _(item).omit('title')];
  })
  .object()
  .value();

Ещё вопросы

Сообщество Overcoder
Наверх
Меню