2016-04-22 67 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

我忽略了你的另一個問題......編輯添加更多答案! –