Обработка данных с сервера
Всем привет. Помогите плиз, туплю на ночь глядя.
Собственно вопрос в следующем. Получаю данные с сервака в json, ну а потом же преобразую в объект var data = { category: [ // Массив категорий {id: "1", name: "Авто", color: "#50bbde"}, {id: "2", name: "Продукты", color: "#50bbde"} ], result: [ // Массив записей, где name, color это категории из category выше, // а также есть idCategory - это id категорий {id: '1', idCategory: '1', nameItem: 'Бензин', price: '300', name: "Авто", color: "#50bbde"}, {id: '2', idCategory: '1', nameItem: 'Мойка', price: '100', name: "Авто", color: "#50bbde"}, {id: '3', idCategory: '2', nameItem: 'Хлеб', price: '10', name: "Продукты", color: "#50bbde"}, {id: '4', idCategory: '2', nameItem: 'Молоко', price: '15', name: "Продукты", color: "#50bbde"} ] } Данные нужно преобразовать в такой формат [ var data = { name: 'Авто', // Название категории color: '#333333', // Цвет категории res: [ {id: '1', idCategory: '1', nameItem: 'Бензин', price: '300', name: "Авто", color: "#50bbde"} ], price: ''300" // Сумма price всех записей одной категории } ] Собственно я это и сделал вот такой функцией function foo (res) { let arr = []; res.category.forEach(elem => { let item = []; let price = 0; res.result.forEach(el => { if (el.idCategory === elem.id) { item.push(el); price += Number(el.price); } }); arr.push({name: elem.name, color: elem.color, res: item, price}); }); return arr; } console.log(foo(data)); Но у меня такое ощущение что это говно код. Можно ли без data.category, только по data.result сделать то же самое как я сделал функцией foo()? Буду признателен за участие. |
Цитата:
Цитата:
|
рони,
Цитата:
Сократить хочется для того что бы на серваке не делать два запроса - к категориям а потом к записям А сделать один запрос с LEFT JOIN, отдать данные как в data.result и уже на клиенте мутить то что надо. Собственно сначала я так и сделал на серваке, но потом пришлось еще допилить запрос к категориям, и получилось то что получилось. Цитата:
|
Bond,
можно нормальный вариант что на выходе? |
рони,
На выходе массив объектов, [ // Категория Авто { name: 'Авто', // Название категории из data.category[0].name color: '#333333', // Цвет категории res: [ {id: '1', idCategory: '1', nameItem: 'Бензин', price: '300', name: "Авто", color: "#50bbde"}, {id: '2', idCategory: '1', nameItem: 'Мойка', price: '100', name: "Авто", color: "#50bbde"}, ], price: '400' // Сумма всех записей одной категории }, // Категория Продукты { name: 'Продукты', // Название категории из data.category[1].name color: '#333333', // Цвет категории res: [ {id: '3', idCategory: '2', nameItem: 'Хлеб', price: '10', name: "Продукты", color: "#50bbde"}, {id: '4', idCategory: '2', nameItem: 'Молоко', price: '15', name: "Продукты", color: "#50bbde"}, ], price: '25' // Сумма всех записей одной категории }, // Еще какая-то категория {.....} ] |
Bond,
<script> var data = { category: [ // Массив категорий {id: "1", name: "Авто", color: "#50bbde"}, {id: "2", name: "Продукты", color: "#50bbde"} ], result: [ // Массив записей, где name, color это категории из category выше, // а также есть idCategory - это id категорий {id: '1', idCategory: '1', nameItem: 'Бензин', price: '300', name: "Авто", color: "#50bbde"}, {id: '2', idCategory: '1', nameItem: 'Мойка', price: '100', name: "Авто", color: "#50bbde"}, {id: '3', idCategory: '2', nameItem: 'Хлеб', price: '10', name: "Продукты", color: "#50bbde"}, {id: '4', idCategory: '2', nameItem: 'Молоко', price: '15', name: "Продукты", color: "#50bbde"} ] } function fn(arr) { var obj = {}, data = []; arr.forEach(function(el) { var index = obj[el.name]; if (index == void 0) { index = obj[el.name] = data.length; data.push({name:el.name, color:el.color, res:[], price:0}); } var item = data[index]; item.res.push(el); item.price += +el.price; }); return data; } document.write(JSON.stringify(fn(data.result))) </script> |
рони,
Спасибо, это как раз то что я хотел, но не осилил ) |
Часовой пояс GMT +3, время: 14:37. |