合并两个对象返回undefined

时间:2018-04-30 07:31:38

标签: javascript jquery object

我有两个Object并希望合并这两个对象。一个对象在 ADD TO CART 部分click之后创建,然后我将此对象存储到localstorage,第二个对象从localstorage获得,现在我想合并这两个{点击后{1}}这是我的代码:



object

/***********************************RESTORE CART *********************************************/

var html = '';
var p = 0;
var q = 0;

//var cartS = JSON.parse(localStorage.getItem("cart"));
// for remove error I managed to set empty object

var cartS = new Object();

$.each(cartS, function(i, v) {
  html += '<div class="cart-item" data-id="' + cartS[i].id + '">' + cartS[i].title + '<span> × ' + cartS[i].quantity + '</span> ' + cartS[i].price + ' $</div>';
  p += Number(cartS[i].price * cartS[i].quantity);
  q += cartS[i].quantity;
});
$('#cart').empty().html(html);
$('#total').empty().html('Total price: ' + p + ' $');
$('#count').empty().html('Total Items: ' + q);

/***********************************ADD TO CART *********************************************/

const cart = {};

$('li').click(function(e) {
  const id = e.target.dataset.id;
  const title = $(this).text();
  const price = e.target.dataset.price;

  var html = '';
  var p = 0;
  var q = 0;

  if (!cart[id]) cart[id] = {
    id,
    title,
    price,
    quantity: 0
  }
  cart[id].quantity++;

  $.each(cart, function(i, v) {
    html += '<div class="cart-item" data-id="' + cart[i].id + '">' + cart[i].title + '<span> × ' + cart[i].quantity + '</span> : ' + cart[i].price + ' $</div>';
    p += Number(cart[i].price * cart[i].quantity);
    q += cart[i].quantity;
  });

  $('#cart').empty().html(html);
  $('#total').empty().html('Total price:' + p + ' $');
  $('#count').empty().html('Total Items: ' + q);

  //localStorage.setItem("cart", JSON.stringify(cart)); // store objects in localstorage
});
&#13;
#total {
  color: green;
}

a {
  display: block;
}

.cart-item {
  background: #ffe1e1;
  margin-bottom: 1px;
  padding: 5px;
}
&#13;
&#13;
&#13;

我尝试了什么:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
  <li data-id="1" data-price="50">Product 1</li>
  <li data-id="2" data-price="25">Product 2</li>
  <li data-id="3" data-price="15">Product 3</li>
  <li data-id="4" data-price="50">Product 4</li>
</ul>

<div id="cart"></div>
<br><br>
<a id="total"></a>
<a id="count"></a>

此外:

Array.prototype.push.apply(cart,cartS);

但它不会合并。

请注意,代码段会返回错误,因为SO不支持$.merge( cartS, cart );

目标:

我点击后创建对象,并将其存储在localstorage上,然后在页面重新加载后,我从localstorage获得了对象,现在想要用户点击,将当前对象与我从localstorage获得的第二个对象合并。它与购物车类似。

3 个答案:

答案 0 :(得分:2)

@Injectable() export class UtilsService { constructor( private _api: ApirequestService ) { } getItems(url, data, succFunc?: (data) => void, errFunc?: (err) => void, compFunc?: () => void) { return this._api.fetchApiData(url,data).subscribe( data => { if( succFunc != undefined && typeof succFunc == 'function' ) succFunc(data); }, error => { if( errFunc != undefined && typeof errFunc == 'function' ) errFunc(error); }, () => { if( compFunc != undefined && typeof compFunc == 'function' ) compFunc(); } ) } cartS都是对象而不是数组。不要使用仅适用于数组的cart,而应考虑使用$.extend

$.merge

答案 1 :(得分:2)

$.merge()用于合并两个数组cartcartS是普通对象,而不是数组。

但是为什么你还有两个单独的购物车对象?您可以直接更新您从localStorage中读取的对象。

答案 2 :(得分:0)

您可以使用Object.assign方法合并两个对象。

let newObject = Object.assign(cart, cartS)