У меня есть набор данных в формате:
[{"title":movietitle1, "id":445, "release":"16JUN1985"}, {"title":movietitle2, "id":487, "release":"12AUG1993"}]
Который мне нужно преобразовать в JSON, отформатированный как таковой:
{ "movietitle1":{"id":445,"release":"16JUN1985"}, "movietitle2":{"id":487, "release":"12AUG1993"} }
Я не знаю, как это сделать.
Вы можете сделать это с помощью 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
map
подчеркивания также должна создавать переменную внутренне ... То, что вы не создаете переменную, не означает, что ваш код более эффективен. Кроме того, сделать одну переменную для вывода и другую для итератора вместо загрузки всей библиотеки? давай ... Это очень скудно и эффективно по сравнению с этим.
То, о чем вы просите, состоит в том, чтобы превратить массив в карту, используя конкретное свойство. Если вы действительно хотите JSON, вы можете просто вызвать JSON.stringify на результирующем объекте JS.
/**
* 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?
Ext
?
Ваши условия смешивания. Я предполагаю, что вы спрашиваете об управлении данными с объектами 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();