DJWOMS1
@DJWOMS1
Веб-программист

Как правильно распарсить массив?

интересует как сделать массив объектов из полученных данных.
Интересует как это сделать на coffeescript, так как учу его, но можно и на js.
Данные
{"mh": [{"id": "BR", "count": 18516, "title": "Brazil"}, 
    {"id": "US", "count": 4514, "title": "United States"}, 
    {"id": "MY", "count": 390, "title": "Malaysia"}, 
    {"id": "IT", "count": 208, "title": "Italy"}]
}

Нужно привести к виду
"areas": [
    {
    "id": "US",
    "title": "United States - 4514"
    },
    {
    "id": "IT",
    "title": "Italy - 208"
    }
]
  • Вопрос задан
  • 2490 просмотров
Решения вопроса 1
sergiks
@sergiks Куратор тега JavaScript
♬♬
Создать объект со свойством areas:
var result = { "areas": "значение для areas"}

Взять массив из свойства "mh" исходных данных. Это запись в JSON поэтому просто пишем
peremennaya = {...тут весь этот JSON...}
peremennaya.mh // тут нужный массив


Из этого массива нужно сделать новый, где каждый элемент будет содержать только два свойства: id и title. Первое берется из оригинала как есть, а второе нужно составить, собрав значения свойств элемента title и count через пробел-дефис-пробел:
'' + el.title + ' - ' + el.count

Когда нужно над каждым элементом массива произвести какое действие, удобен метод массивов map(). В него передаётся функция, которая, получая на вход очередное значение из массива, что-то с ним делает и возвращает новое значение.

Итого:
var d = {"mh": [{"id": "BR", "count": 18516, "title": "Brazil"}, 
    {"id": "US", "count": 4514, "title": "United States"}, 
    {"id": "MY", "count": 390, "title": "Malaysia"}, 
    {"id": "IT", "count": 208, "title": "Italy"}]
};

var result = {areas: d.mh.map(el => ({id:el.id, title:''+el.title+' - '+el.count}))}

// {"areas":[{"id":"BR","title":"Brazil - 18516"},{"id":"US","title":"United States - 4514"},
//   {"id":"MY","title":"Malaysia - 390"},{"id":"IT","title":"Italy - 208"}]}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
mudrenokanton
@mudrenokanton
frontend dev
const some = { areas: mh.map((el) => ({ id: el.id, title: el.title })) }
Ответ написан
Комментировать
e20860
@e20860
Работал с СУБД, осваиваю WEB
Решение данной задачи предполагает перебор элементов массива и создание на его основе трансформированных новых значений.
Теория вопроса: Простая и Умная

Простые (канонические - до ES6) варианты:
Имеющийся объект для трансформации задан.
// Имеем объект, представляющий из себя массив простых объектов   
oldObj = {"mh": [{"id": "BR", "count": 18516, "title": "Brazil"}, 
                 {"id": "US", "count": 4514, "title": "United States"}, 
                 {"id": "MY", "count": 390, "title": "Malaysia"}, 
                 {"id": "IT", "count": 208, "title": "Italy"}
                ]
};


Решения:
1. С использованием метода map и созданием отдельной функции:
// при желании функцию трансформации можно назвать конструктором со всеми вытекающими...
function transform(oO){
    var rv = {}; // return value
    rv.areas = oO.mh.map(function(str){
        var rs    = {};  // return string
        rs.id     = str.id;
        rs.title  = str.title + " - " + str.count;
        return rs;
    });
    return rv;
};
var newObj1 = transform(oldObj);
// В случае конструктора 
// var newObj1 = new Transform(oldObj)
console.log(newObj1);
// полученный объект

Вариант 1.2 С использованием метода map без создания отдельной функции:
var newObj2 = {};

newObj2.areas = oldObj.mh.map(function(str){
     var rs    = {};  // return string
     rs.id     = str.id;
     rs.title  = str.title + " - " + str.count;
     return rs;
});


2. 1Перебор массива (forEach) без метода map
var newObj3 = {"areas":[]};
oldObj.mh.forEach(function(str){
   var ps    = {};  // pushed string
   ps.id     = str.id;
   ps.title  = str.title + " - " + str.count;
   newObj3.areas.push(ps);
});


2.2 Перебор массива с использованием цикла for
var newObj4 = {"areas":[]};
for (var i = 0; i<oldObj.mh.length;i++) {
   var  str = oldObj.mh[i];
   var ps    = {};  
   ps.id     = str.id;
   ps.title  = str.title + " - " + str.count;
   newObj4.areas.push(ps);
}

Стрелочные функции, показанные в предыдущих ответах могут работать не во всех браузерах, хотя с точки зрения оптимизации кода - более эффективны...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 05:01
999999 руб./за проект
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект