Проблема с выводом данных в формате JSON в NodeJS

188
14 марта 2018, 07:40

Всем привет, столкнулся с проблемой вывода в формате 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"
  }]
 }
Answer 1

У вас ошибка вот здесь:

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);

READ ALSO
JS случайное значение массива

JS случайное значение массива

Нужно по нажатию на кнопку присвоить ей(кнопке) backgroundColor на один из цветов радугиЯ сделал это следующим образом

216
разбор строки во vue.js

разбор строки во vue.js

с бэка прилетает массив строк с разделителями в виде запятой:

145
Все о VPS Hosting

Все о VPS Hosting

У меня есть не большое веб-приложениеХочу запускать на интернете

203