2016-04-22 77 views
0

我有一个表格的HTML文件来填写一个人来接受订单。我有一个全局数组来存储对象。这些对象包含添加到订单的项目的名称,价格和数量。将对象插入全局数组?

<button type="button" onclick="addToOrder('app2-amount', 'House Salad', '6')">+</button> 

这是调用addToOrder()的地方。

而且功能:

var orderArray = []; 

function addToOrder(id, nameIn, priceIn){ 
if (loggedIn == true){ 
    var quantityIn = document.getElementById(id).value; 
    var totalForThisItem = priceIn*quantityIn; 

    var menuObject = { 
    name: nameIn, 
    price: totalForThisItem, 
    quantity: quantityIn 
    }; 

    // Next we must perform a check to see if an object with the same name already exists in the order 
    // If it does exist, replace it with this new object. 
    if (orderArray.length == 0){ 
    orderArray.push(menuObject); 
    } 
    else{ 
    orderArray.forEach(function (item) { 
     if (item.name == menuObject.name){ 
     item = menuObject; 
     } 
     else{ 
     orderArray.push(menuObject); 
     } 
    }); 
    } 
    console.log("dabs " + orderArray.toString()); 
    } 
    // If user is not logged in: 
    else{ 
    console.log("You are not logged in. Please log in to use this feature."); 
    } 
console.log(menuObject); 
} 

当我打印menuObject,我认为这将是超出范围,删除。我将它插入到一个全局变量中,我认为它正在把我搞砸。

当我开始将不同的菜单项放入数组时,会发生一些奇怪的事情。在一个案例中,每增加一个新闻,它就会增加3,6,12,24等等。有趣,但我很沮丧。

这里会发生什么?

+0

'当我打印menuObject时,我认为它会超出范围,删除'因为你打印它的功能(最后),它还没有超出范围。除此之外,你的问题不清楚你的问题究竟是什么?将一些示例/场景与数据进行解释。 – TheUknown

+0

当我将不同的菜单项添加到列表中时,会出现奇怪的现象。 我也很习惯Java编码,我没有意识到它没有超出函数的范围(认为最后一个括号是类结尾)。 但它超出了范围。这是否意味着什么? – kaleoh

+0

尝试将'item = menuObject;'改为'item.name = menuObject.name; item.price = menuObject.price; item.quantity = menuObject.quantity'或者直接插入到数组中 – TheUknown

回答

3

我想,你已经略微误解了Javascript中的词汇范围。

var声明的范围在功能块级别。这意味着即使您的var语句位于if块的范围内,它的作用范围仍在整个函数中,并且在函数退出之前保持定义状态。由于hoisting,它们在函数中的任何地方都是有效的(甚至在它们声明之前)。

如果您正在使用ES6编写代码,您还可以使用let declarations,它们的作用域是最近的封闭块......在您的情况下,if块。那就是我认为你在这里期待的行为。

您的其他问题是合乎逻辑的。每次传递函数时,都会使用forEach来遍历数组,然后可能会为数组中的每个现有对象推送一次新对象。这就是为什么你在数组长度上获得几何级数的原因。

如果您的意图是'替换数组中匹配的项目,如果它已经存在,否则将其添加到结尾',那么有几种方法可以做到这一点。 Array.find是一种选择,但有几种方法可行。

+0

谢谢。我想我根本不需要它,可以直接使用: '{name:nameIn,price:totalForThisItem,quantity:quantityIn}' 我在哪里使用menuObject。 – kaleoh

+1

我忽略了你的另一个问题......编辑添加更多答案! –