Всем привет, столкнулся с проблемой вывода в формате JSON в NodeJS. Может я как-то не так это делаю? Формирую объект prod собирая данные из массива its. Здесь вывод в формат JSON делается правильно, для каждого объекта (смотреть первые 2 строки вывода - данные разные). После того как с помощью метода push я записываю эти данные в объект _receipt в свойство Items через цикл for, JSON выдает мне одинаковые данные.
var _receipt = {
Email: "email",
Phone: "phone",
Taxation: "tax_info"
};
// Получить массив элементов из карточки
var its = cart.generateArray();
var prod = {};
_receipt.Items = [];
// Заполнить объект prod
for (var id in its){
prod.Name = its[id].item.title;
prod.Price = its[id].item.price;
prod.Quantity = its[id].qty;
prod.Amount = prod.Quantity * prod.Price;
prod.Tax = "tax_info";
_receipt.Items.push(prod); // записать в _receipt.Items
console.log(JSON.stringify(prod));
}
console.log('-----');
console.log(_receipt);
console.log('-----');
var receipt = JSON.stringify(_receipt);
console.log(receipt);
Вывод:
{"Name":"Name1","Price":3400,"Quantity":2,"Amount":6800,"Tax":"tax_rate"}
{"Name":"Name2","Price":5500,"Quantity":1,"Amount":5500,"Tax":"tax_rate"}
-----
{ Email: 'email',
Phone: 'phone',
Taxation: 'tax_info',
Items:
[ { Name: 'Name1',
Price: 5500,
Quantity: 1,
Amount: 5500,
Tax: 'vat0' },
{ Name: 'Name2',
Price: 5500,
Quantity: 1,
Amount: 5500,
Tax: 'vat0' } ] }
-----
{
"Email":"email",
"Phone":"phone",
"Taxation":"tax_info",
"Items":
[{
"Name":"Name1",
"Price":5500,
"Quantity":1,
"Amount":5500,
"Tax":"tax_rate"
},
{
"Name":"email",
"Price":5500,
"Quantity":1,
"Amount":5500,
"Tax":"tax_rate"
}]
}
У вас ошибка вот здесь:
var prod = {};
Вы создаёте один объект, и в цикле меняете ему свойства. И помещаете в массив одну и ту же ссылку на объект prod. В итоге в массиве будет сколько угодно одинаковых ссылок с таким объектом, каким он получился на последнем витке цикла.
Чтобы это исправить, вам нужно создавать новый объект каждый раз перед помещением в массив на каждой итерации цикла, так в массив будут попадать разные объекты с уникальными ссылками.
Это всё особенность JavaScript с его динамической природой, например, если вы сделаете так,
let A = { q: 'to be!' };
let B = A;
B.q = 'not to be!';
console.log(A);
то в результате получите то, что объект A изменился вместе с объектом B (что может показаться неожиданным), так как они ссылаются на один и тот же объект в памяти.
Если вам нужно избежать такого поведения в случае создания объекта не с нуля, а из другого объекта, то вам уже следует использовать Object.assign({}, someObject)
(но это не единственный возможный вариант).
Для вашего примера исправленный вариант:
var _receipt = {
Email: "email",
Phone: "phone",
Taxation: "tax_info"
};
// Получить массив элементов из карточки
var its = {
0: {"Name":"Name1","Price":3400,"Quantity":2,"Amount":6800,"Tax":"tax_rate"},
1: {"Name":"Name2","Price":5500,"Quantity":1,"Amount":5500,"Tax":"tax_rate"}
};
_receipt.Items = [];
// Заполнить объект prod
for (let id in its) {
let prod = {};
prod.Name = its[id].Name;
prod.Price = its[id].Price;
prod.Quantity = its[id].Quantity;
prod.Amount = prod.Quantity * prod.Price;
prod.Tax = "tax_info";
_receipt.Items.push(prod); // записать в _receipt.Items
console.log(JSON.stringify(prod));
}
console.log('-----');
console.log(_receipt);
console.log('-----');
var receipt = JSON.stringify(_receipt);
console.log(receipt);
Нужно по нажатию на кнопку присвоить ей(кнопке) backgroundColor на один из цветов радугиЯ сделал это следующим образом