Как добавить объект к каждому элементу в массиве - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь добавить объект в массив, но cart[i]['items'][j][order] не устанавливается должным образом.

При регистрации cart[i]['order'] возвращается Object.

Корзина имеет вид:

[{
  "order": {
    "amtSubTotal": 3812.8900000000003,
    "noPo": "Default P.O."
  },
  "items": [{
    "adjustments": { "isCustom": "N" }, 
    "lineNote": { "noteLine": "" }
  },{
    "adjustments": { "isCustom": "N" }, 
    "lineNote": { "noteLine": "" }
  }]
}]

Ожидаемый результат

[{
  "order": { "amtSubTotal": 3812.8900000000003,"noPo": "Default P.O." },
  "adjustments": { "isCustom": "N" }, 
  "lineNote": { "noteLine": "" }
  }, {
  "order": { "amtSubTotal": 3812.8900000000003,"noPo": "Default P.O." },
  "adjustments": { "isCustom": "N" }, 
  "lineNote": { "noteLine": "" }
}]

Код

let cart = JSON.parse(localStorage.getItem('cart-data'));
let i = 0, j = 0, l = cart.length;
let nData = [];
for (i = 0; i < l; i++) {
  let m = cart[i]['items'].length;
  for (j = 0; j < m; j++) {                                                      // Spreading data {...data[i]} created a shallow copy bug
    cart[i]['items'][j].push({"order": cart[i]['order']}); // Try using JSON methods instead
    nData.push(cart[i]['items'][j]);
  }
}

Альтернативная попытка

for (i = 0; i < l; i++) {
  let m = cart[i]['items'].length;
  for (j = 0; j < m; j++) {
    // cart[i]['items'][j]['order'] = JSON.stringify(JSON.parse(cart[i]['order'])); // Try using JSON methods instead
    nData.push(cart[i]['items'][j]);
  }
}

console.log(nData); // order data not appended to cart[i]['items'][j]

Как добавить этот объект к каждому элементу cart[i]['items'][j]?

Ответы [ 3 ]

0 голосов
/ 30 марта 2020

Используйте map () для изменения вашего объекта на каждой итерации и добавления свойств объекта items для итерации по ключевым значениям for(let [key, value] of Object.entries(itemObj)

Попробуйте запустить этот фрагмент. Я добавил второй товар в корзину для тестирования

let cart=[{"order": {"amtSubTotal": 3812.8900000000003,"noPo": "Default P.O."},"items": [{"adjustments": { "isCustom": "N" }, "lineNote": { "noteLine": "" }},{"adjustments": { "isCustom": "N" }, "lineNote": { "noteLine": "" }}]},{"order": {"amtSubTotal": 3112.8900000000003,"noPo": "Default R.O."},"items": [{"adjustments": { "isCustom": "Y" }, "lineNote": { "noteLine": "1" }},{"adjustments": { "isCustom": "N" }, "lineNote": { "noteLine": "5" }}]}]
let result=cart.map( orderObj =>{
   let obj={order:orderObj.order};
   orderObj.items.forEach( itemObj =>{
      for(let [key, value] of Object.entries(itemObj))
          obj[key]=value;
   });
   return obj
}); 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 30 марта 2020

Вы можете попробовать с деструктуризацией и картой, как показано ниже. (В аргументе функции стрелки деструктурируйте order и items, используйте map для наложения элементов и добавления содержимого заказа.)

const update = ([{ order, items }]) => items.map(itm => ({ order: {...order}, ...itm }));

const data = [
  {
    order: {
      amtSubTotal: 3812.8900000000003,
      noPo: "Default P.O."
    },
    items: [
      {
        adjustments: { isCustom: "N" },
        lineNote: { noteLine: "" }
      },
      {
        adjustments: { isCustom: "N" },
        lineNote: { noteLine: "" }
      }
    ]
  }
];

console.log(update(data));
0 голосов
/ 30 марта 2020

Ваш код генерирует ошибку на pu sh из cart[i]['items'][j].push(...) remove a [j]

Попробуйте это:

let carts = [{
  order: {
    amtSubTotal: 3812.8900000000003,
    noPo: "Default P.O."
  },
  items: [{
    adjustments: { "isCustom": "N" }, 
    lineNote: { "noteLine": "" }
  },{
    adjustments: { "isCustom": "N" }, 
    lineNote: { "noteLine": "" }
  }]
}];

nData = [];

carts.forEach((cart, idx1) => {
  cart['items'].forEach((item, idx2) => {
    item.order = cart.order;
    nData.push(item)
  })
});

console.log(nData);

попробуйте эту ручку

...