Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象构造函数未将项分组在一起_Javascript - Fatal编程技术网

Javascript对象构造函数未将项分组在一起

Javascript对象构造函数未将项分组在一起,javascript,Javascript,刚接触js对象构造器,在阅读有关该主题的内容时,我了解了这个示例。我用它将商品添加到一个假设的产品页面,它可以工作,除非我两次添加同一商品,它将商品分组,只增加数量。如果我不想对项目进行分组怎么办 function Cart(oldcart) { this.items = oldcart.items || {}; this.add = function (item, id) { var storeditem = this.items[id]; if (!storedit

刚接触js对象构造器,在阅读有关该主题的内容时,我了解了这个示例。我用它将商品添加到一个假设的产品页面,它可以工作,除非我两次添加同一商品,它将商品分组,只增加数量。如果我不想对项目进行分组怎么办

function Cart(oldcart) {
  this.items = oldcart.items || {};

  this.add = function (item, id) {
    var storeditem = this.items[id];
    if (!storeditem) {
      storeditem = this.items[id] = { item: item, qty: 0, price: 0 };
    }
    storeditem.qty++;
    storeditem.price = storeditem.item.itemprice * storeditem.qty;
  };
}

var cart = new Cart(req.session.cart ? req.session.cart : {});
cart.add(data, id);
req.session.cart = cart;
我对代码的理解是,它检查this.items是否具有新添加项的id

var storeditem = this.items[id];
如果没有,则创建项目

if (!storeditem) {
  storeditem = this.items[id] = { item: item, qty: 0, price: 0 };
}
但是,如果我不想将项目分组在一起,而只想将项目单独列出,那么如何在this.add方法中做到这一点?当我这样做时:

this.items[id] = { item: item, qty: 0, price: 0 };

它用新项替换旧项。我做错了什么?请不要告诉我如何使用jquery,这是一个很棒的工具,但我想学习如何在纯js中使用它。

目前,您正在将每个新项存储在一个对象中。如果您想要每个单独项目的列表,请切换到数组。因此,
this.items
应该是一个数组

add
方法中,使用
this.items
上的
push
方法将新项添加到数组中。现在,您已将项目添加到列表中。从这里,您可以通过在列表上循环并将所有
itemprice
值相加来计算总价

功能购物车(旧购物车){
this.items=oldcart.items | |[];
this.total=oldcart.total | | 0;
} 
Cart.prototype.add=功能(项目){
此.items.push(item);
this.total=this.items.reduce(函数(total,currentItem){
返回总计+currentItem.itemprice;
}, 0);
};
var cart=新购物车({});
cart.add({id:52,name:'humber',itemprice:3.20});
添加({id:2,名称:'Banana',itemprice:0.30});
添加({id:2,名称:'Banana',itemprice:0.30});
console.log('Cart items:',Cart.items);

console.log('Price total:',cart.total)
您正在使用
id
作为密钥。基于此代码,如果要单独列出它们,则必须使用新的
id
或以不同的方式索引它们。此外,如果目的是单独列出所有内容,我建议只保留一个数组并推送到该数组,而不是使用对象。另外,在这种情况下,
quantity
属性很可能是不相关的。您能解释一下您的预期结果是什么吗?鉴于此代码,我不确定我是否理解
this.items[id]
允许您每个id只能有一个条目。您可以为每个id设置一个数组,也可以将
this.items
保留为一个数组,而不是按id进行索引。或者甚至可以保留代码,但将字典转换为显示,将数量替换为具有重复项的平面列表。@JonathanHamel谢谢。对。如果我单独推送到一个数组,那么就不需要添加数量。我有用户将添加到某些项目中的选项,而有些项目没有选项,因此我会将没有选项的项目和用户将使用选项单独自定义的单独项目分组为一个列表,这就是我在其中添加数量的原因。Emiel,在您的评论中,您提到要在数组中存储单独的项目。在对象中也可以这样做,那么为什么要切换到数组呢?数组是专门处理列表的对象。它们提供了多种方法,允许您循环其中的项目。您还可以将每个项设置为对象中的一个新键,但数组可以使用整数作为键来实现这一点。简单地说,它是这项工作的正确工具。