购物车实现Javascript。TypeError:无法设置属性';id';未定义的

购物车实现Javascript。TypeError:无法设置属性';id';未定义的,javascript,jquery,arrays,Javascript,Jquery,Arrays,我正在尝试实现基本的购物车,但我遇到了一个问题。我需要检查商品是否已经存在于购物车中,如果存在,则增加其数量。但是当我试图比较购买[I].id=this.arr[I].id它给我以下错误 TypeError:无法设置未定义的属性“id”` 购物车代码实现示例: var Cart = { AddToCart:function(arr,buttonId){ var purchases = [{id: null,name: null,price: null,quant

我正在尝试实现基本的购物车,但我遇到了一个问题。我需要检查商品是否已经存在于购物车中,如果存在,则增加其数量。但是当我试图比较
购买[I].id=this.arr[I].id它给我以下错误

TypeError:无法设置未定义的属性“id”`

购物车代码实现示例:

    var  Cart = {
    AddToCart:function(arr,buttonId){
        var purchases = [{id: null,name: null,price: null,quantity: 0}];
        this.arr = arr;
        this.buttonId = buttonId;
        for(var i = 0; i <this.arr.length; i++){
            if(this.buttonId === this.arr[i].id && purchases[i].id === this.arr[i].id && $("#oredersUL, #" + this.buttonId).length){
                purchases[i].quantity++;
                console.log(purchases[i]);
            }
           else {

                 purchases[i].id = this.arr[i].id;
                 purchases[i].name = this.arr[i].name;
                 purchases[i].price = this.arr[i].price;
                 purchases[i].quantity++;


                console.log(purchases);
            }

        }
    }
};
给定数组:

var phones = [
    {
        "age": 0,
        "id": "motorola-xoom-with-wi-fi",
        "imageUrl": "img/phones/motorola-xoom-with-wi-fi.0.jpg",
        "name": "Motorola XOOM\u2122 with Wi-Fi",
        "snippet": "The Next, Next Generation\r\n\r\nExperience the future with Motorola XOOM with Wi-Fi, the world's first tablet powered by Android 3.0 (Honeycomb).",
        "price": 150
    },

您正在询问
purchases[i].id==this.arr[i].id
purchases[i]
是否不存在(即使
i
的其他值可能不存在)

首先检查索引
i
处的元素是否存在:

if (typeof purchases[i] === 'undefined')
现在,如果
购买[i]
不存在,您需要创建它。我会使用
push

purchases.push({
    "id": this.arr[i].id,
    "name": this.arr[i].name,
    "price": this.arr[i].price,
    // I have not included "quantity" here because 
    // what you have right now doesn't make sense:
    // purchases[i] doesn't exist
    // so the same is true for purchases[i].quantity
});
使用
.push
将意味着您不能信任每个数组元素的内容的数组索引(但这可能是个坏主意-这就是为什么您的对象具有
id


这意味着,要更新正确的数组元素,您将需要执行(通过id查找数组中的对象)

如果在生成错误的行之前执行
console.log(arr)
,您会得到什么?您正在使用相同的索引进行
purchases
arr
,尽管您没有测试“purchases[i]`由于
null
@rorymcrossan,它在位置i处为我提供了数组:
[Object]0:Objectid:“带wi-fi的摩托罗拉xoom”名称:“摩托罗拉xoom”™ 使用Wi-Fi“价格:150数量:1协议:对象长度:1协议:阵列[0]
purchases.push({
    "id": this.arr[i].id,
    "name": this.arr[i].name,
    "price": this.arr[i].price,
    // I have not included "quantity" here because 
    // what you have right now doesn't make sense:
    // purchases[i] doesn't exist
    // so the same is true for purchases[i].quantity
});