15.03.2018, 01:02
|
Профессор
|
|
Регистрация: 16.06.2013
Сообщений: 172
|
|
Обработка данных с сервера
Всем привет. Помогите плиз, туплю на ночь глядя.
Собственно вопрос в следующем.
Получаю данные с сервака в 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()?
Буду признателен за участие.
Последний раз редактировалось Bond, 15.03.2018 в 01:29.
|
|
15.03.2018, 01:11
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
Сообщение от Bond
|
Данные нужно преобразовать в такой формат
|
не осилил
Сообщение от Bond
|
Собственно я это и сделал вот такой функцией
|
код как код
|
|
15.03.2018, 01:24
|
Профессор
|
|
Регистрация: 16.06.2013
Сообщений: 172
|
|
рони,
ну то есть категорию нужно записать в объект, и в тот же объект запихнуть все записи этой категории, а также сумму всех записей.
Сократить хочется для того что бы на серваке не делать два запроса - к категориям а потом к записям
А сделать один запрос с LEFT JOIN, отдать данные как в data.result и уже на клиенте мутить то что надо.
Собственно сначала я так и сделал на серваке, но потом пришлось еще допилить запрос к категориям, и получилось то что получилось.
это радует ))
|
|
15.03.2018, 01:28
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
Bond,
можно нормальный вариант что на выходе?
|
|
15.03.2018, 01:37
|
Профессор
|
|
Регистрация: 16.06.2013
Сообщений: 172
|
|
рони,
На выходе массив объектов,
[
// Категория Авто
{
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, 15.03.2018 в 01:42.
|
|
15.03.2018, 01:56
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,126
|
|
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>
|
|
15.03.2018, 02:19
|
Профессор
|
|
Регистрация: 16.06.2013
Сообщений: 172
|
|
рони,
Спасибо, это как раз то что я хотел, но не осилил )
|
|
|
|