Javascript - 尝试在遍历数组对象值后将它们相加
Javascript - trying to add array object values together after looping through them
我正在尝试进行迷你结帐 JavaScript 练习。用户将 2 个或更多项目添加到一起 (checkbox
) 选项,项目的价格合计然后返回。出于某种原因,我无法将数组对象的值加在一起。我的代码中的其他所有内容都只适用于该 1 部分。有人可以帮帮我吗?我的代码如下:
JavaScript
// This Array Object holds the items name and prices the user selects from
var shoppingItems = {
"Stainless Steel Cooking Pot": 29.99,
"Mini Stainless Steel Blender": 19.99,
"Kitchen Towel Set": 7.99,
"Large Tan Coffee Mug": 5.49,
"5 Round Dinner Plate Set": 5.99,
"Salt and Pepper Shaker Set": 1.99,
"Large Blue Broom": 3.98,
"Pink Soap Dish": 2.50,
"Silver Bathroom Trash Can": 6.99,
"Silk Black Bathroom Robe": 9.99,
};
var itemsSelectedValues = [];
// this is the empty array where the checkbox values will be added to
var total = 0;
// this is the variable that will hold the items total
function listOfCheckedItems(catalogToLookFrom) {
var yourItemsPurchased = $("input:checkbox:checked");
for (i = 0; i < yourItemsPurchased.length; i++) {
if(yourItemsPurchased[i].checked === true) {
itemsSelectedValues.push(yourItemsPurchased[i].value);
} // line closes if statement
} // line closes for loop
for (i = 0; i < itemsSelectedValues.length; i++) {
// line above is suppose to loop through the now full array that has the items value names stored
total = total + catalogToLookFrom[itemsSelectedValues];
// this line is suppose to set variable total to itself + the value of the item that's stored in array shoppingItems. It's suppose to do this each time through the loop. This is where the problem lies.
} // closes for loop
console.log(catalogToLookFrom[itemsSelectedValues]);
return total;
} // line closes listOfCheckedItems function
function getOrderTotal() {
listOfCheckedItems(shoppingItems);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="cash-register.html" method="post">
<p style="color:#A569BD; font-size:20px; text-decoration:underline; margin-left:20px;">Department Store Items</p>
<input type="checkbox" name="products[]" value="Stainless Steel Cooking Pot">Stainless Steel Cooking Pot - .99<br>
<input type="checkbox" name="products[]" value="Mini Stainless Steel Blender">Mini Stainless Steel Blender - .99<br>
<input type="checkbox" name="products[]" value="Kitchen Towel Set">Kitchen Towel Set - .99<br>
<input type="checkbox" name="products[]" value="Large Tan Coffee Mug">Large Tan Coffee Mug - .49<br>
<input type="checkbox" name="products[]" value="5 Round Dinner Plate Set">5 Round Dinner Plate Set - .99<br>
<input type="checkbox" name="products[]" value="Salt and Pepper Shaker Set">Salt and Pepper Shaker Set - .99<br>
<input type="checkbox" name="products[]" value="Large Blue Broom">Large Blue Broom - .98<br>
<input type="checkbox" name="products[]" value="Pink Soap Dish">Pink Soap Dish - .5<br>
<input type="checkbox" name="products[]" value="Silver Bathroom Trash Can">Silver Bathroom Trash Can - .99<br>
<input type="checkbox" name="products[]" value="Silk Black Bathroom Robe">Silk Black Bathroom Robe - .99
<br/>
<br/>
<button type="button" name="yourOrder" onclick="getOrderTotal()">Submit</button>
<br/>
<br/>
</form>
您可以在此处使用不同且更简洁的逻辑。
使用 jQuery 选择元素后,您可以使用 .each()
遍历这些对象,其中 this
上下文将直接是元素。
此外,您不需要包含值的数组,您可以简单地在 each()
函数内求和,将选择的值传递给 shoppingItems
的数组以您检索 $ 值的方式。在迭代结束时,您将获得总值。
正如我在回答的评论中所说,一旦您在 jQuery 中选择了已选中的那些,则无需检查 this.checked === true
。
请看一下:
var shoppingItems = {
"Stainless Steel Cooking Pot": 29.99,
"Mini Stainless Steel Blender": 19.99,
"Kitchen Towel Set": 7.99,
"Large Tan Coffee Mug": 5.49,
"5 Round Dinner Plate Set": 5.99,
"Salt and Pepper Shaker Set": 1.99,
"Large Blue Broom": 3.98,
"Pink Soap Dish": 2.50,
"Silver Bathroom Trash Can": 6.99,
"Silk Black Bathroom Robe": 9.99,
};
function listOfCheckedItems(catalogToLookFrom) {
var yourItemsPurchased = $("input:checkbox:checked");
var totalValue = 0;
yourItemsPurchased.each(function(){
totalValue += parseFloat(shoppingItems[this.value]);
})
console.log(totalValue);
return totalValue;
}
function getOrderTotal() {
listOfCheckedItems(shoppingItems);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="cash-register.html" method="post">
<p style="color:#A569BD; font-size:20px; text-decoration:underline; margin-left:20px;">Department Store Items</p>
<input type="checkbox" name="products[]" value="Stainless Steel Cooking Pot">Stainless Steel Cooking Pot - .99<br>
<input type="checkbox" name="products[]" value="Mini Stainless Steel Blender">Mini Stainless Steel Blender - .99<br>
<input type="checkbox" name="products[]" value="Kitchen Towel Set">Kitchen Towel Set - .99<br>
<input type="checkbox" name="products[]" value="Large Tan Coffee Mug">Large Tan Coffee Mug - .49<br>
<input type="checkbox" name="products[]" value="5 Round Dinner Plate Set">5 Round Dinner Plate Set - .99<br>
<input type="checkbox" name="products[]" value="Salt and Pepper Shaker Set">Salt and Pepper Shaker Set - .99<br>
<input type="checkbox" name="products[]" value="Large Blue Broom">Large Blue Broom - .98<br>
<input type="checkbox" name="products[]" value="Pink Soap Dish">Pink Soap Dish - .5<br>
<input type="checkbox" name="products[]" value="Silver Bathroom Trash Can">Silver Bathroom Trash Can - .99<br>
<input type="checkbox" name="products[]" value="Silk Black Bathroom Robe">Silk Black Bathroom Robe - .99
<br/>
<br/>
<button type="button" name="yourOrder" onclick="getOrderTotal()">Submit</button>
<br/>
<br/>
</form>
你忘记了循环中的[i]
total = total + catalogToLookFrom[itemsSelectedValues[i]];
这是一个非常简化的版本
$(function() { // when the page loads
$("input:checkbox").on("change", function() { // each time something changes
var total = 0;
$("input[type=checkbox]:checked").each(function() { // only checked boxes
total += shoppingItems[this.value]; // the prices are already numbers
})
$("#total").text(total.toFixed(2)); // 2 decimals
}).change(); // run at load time to calculate
})
// This Array Object holds the items name and prices the user selects from
var shoppingItems = {
"Stainless Steel Cooking Pot": 29.99,
"Mini Stainless Steel Blender": 19.99,
"Kitchen Towel Set": 7.99,
"Large Tan Coffee Mug": 5.49,
"5 Round Dinner Plate Set": 5.99,
"Salt and Pepper Shaker Set": 1.99,
"Large Blue Broom": 3.98,
"Pink Soap Dish": 2.50,
"Silver Bathroom Trash Can": 6.99,
"Silk Black Bathroom Robe": 9.99,
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="cash-register.html" method="post">
<p style="color:#A569BD; font-size:20px; text-decoration:underline; margin-left:20px;">Department Store Items</p>
<input type="checkbox" name="products[]" value="Stainless Steel Cooking Pot">Stainless Steel Cooking Pot - .99<br>
<input type="checkbox" name="products[]" value="Mini Stainless Steel Blender">Mini Stainless Steel Blender - .99<br>
<input type="checkbox" name="products[]" value="Kitchen Towel Set">Kitchen Towel Set - .99<br>
<input type="checkbox" name="products[]" value="Large Tan Coffee Mug">Large Tan Coffee Mug - .49<br>
<input type="checkbox" name="products[]" value="5 Round Dinner Plate Set">5 Round Dinner Plate Set - .99<br>
<input type="checkbox" name="products[]" value="Salt and Pepper Shaker Set">Salt and Pepper Shaker Set - .99<br>
<input type="checkbox" name="products[]" value="Large Blue Broom">Large Blue Broom - .98<br>
<input type="checkbox" name="products[]" value="Pink Soap Dish">Pink Soap Dish - .5<br>
<input type="checkbox" name="products[]" value="Silver Bathroom Trash Can">Silver Bathroom Trash Can - .99<br>
<input type="checkbox" name="products[]" value="Silk Black Bathroom Robe">Silk Black Bathroom Robe - .99
<br/>
<br/>
<button type="button" name="yourOrder">Submit</button>
<br/>
<br/>
</form>
Total: $<span id="total"></span>
您可以使用 array.reduce
将您的代码简化为一行代码(请参阅 docs 以减少):
$("input:checkbox:checked").toArray().reduce((a, e) => a + catalog[e.value], 0)
这首先对您的 jQ 集合调用 toArray()
以将其转换为原始数组。在此数组上调用的 reduce
函数将数组 (e
) 中的每个元素传递给回调函数。 reduce
还接受第二个参数 0
,它累加最终总数。此总数重复传递到 reduce
回调的 a
参数中,并添加到从 catalog
对象中获取的每个 e
值。
var shoppingItems = {
"Stainless Steel Cooking Pot": 29.99,
"Mini Stainless Steel Blender": 19.99,
"Kitchen Towel Set": 7.99,
"Large Tan Coffee Mug": 5.49,
"5 Round Dinner Plate Set": 5.99,
"Salt and Pepper Shaker Set": 1.99,
"Large Blue Broom": 3.98,
"Pink Soap Dish": 2.50,
"Silver Bathroom Trash Can": 6.99,
"Silk Black Bathroom Robe": 9.99,
};
const listOfCheckedItems = catalog =>
$("input:checkbox:checked").toArray().reduce((a, e) => a + catalog[e.value], 0)
;
function getOrderTotal() {
console.log(listOfCheckedItems(shoppingItems));
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="cash-register.html" method="post">
<p style="color:#A569BD; font-size:20px; text-decoration:underline; margin-left:20px;">Department Store Items</p>
<input type="checkbox" name="products[]" value="Stainless Steel Cooking Pot">Stainless Steel Cooking Pot - .99<br>
<input type="checkbox" name="products[]" value="Mini Stainless Steel Blender">Mini Stainless Steel Blender - .99<br>
<input type="checkbox" name="products[]" value="Kitchen Towel Set">Kitchen Towel Set - .99<br>
<input type="checkbox" name="products[]" value="Large Tan Coffee Mug">Large Tan Coffee Mug - .49<br>
<input type="checkbox" name="products[]" value="5 Round Dinner Plate Set">5 Round Dinner Plate Set - .99<br>
<input type="checkbox" name="products[]" value="Salt and Pepper Shaker Set">Salt and Pepper Shaker Set - .99<br>
<input type="checkbox" name="products[]" value="Large Blue Broom">Large Blue Broom - .98<br>
<input type="checkbox" name="products[]" value="Pink Soap Dish">Pink Soap Dish - .5<br>
<input type="checkbox" name="products[]" value="Silver Bathroom Trash Can">Silver Bathroom Trash Can - .99<br>
<input type="checkbox" name="products[]" value="Silk Black Bathroom Robe">Silk Black Bathroom Robe - .99
<br/>
<br/>
<button type="button" name="yourOrder" onclick="getOrderTotal()">Submit</button>
<br/>
<br/>
</form>
我正在尝试进行迷你结帐 JavaScript 练习。用户将 2 个或更多项目添加到一起 (checkbox
) 选项,项目的价格合计然后返回。出于某种原因,我无法将数组对象的值加在一起。我的代码中的其他所有内容都只适用于该 1 部分。有人可以帮帮我吗?我的代码如下:
JavaScript
// This Array Object holds the items name and prices the user selects from
var shoppingItems = {
"Stainless Steel Cooking Pot": 29.99,
"Mini Stainless Steel Blender": 19.99,
"Kitchen Towel Set": 7.99,
"Large Tan Coffee Mug": 5.49,
"5 Round Dinner Plate Set": 5.99,
"Salt and Pepper Shaker Set": 1.99,
"Large Blue Broom": 3.98,
"Pink Soap Dish": 2.50,
"Silver Bathroom Trash Can": 6.99,
"Silk Black Bathroom Robe": 9.99,
};
var itemsSelectedValues = [];
// this is the empty array where the checkbox values will be added to
var total = 0;
// this is the variable that will hold the items total
function listOfCheckedItems(catalogToLookFrom) {
var yourItemsPurchased = $("input:checkbox:checked");
for (i = 0; i < yourItemsPurchased.length; i++) {
if(yourItemsPurchased[i].checked === true) {
itemsSelectedValues.push(yourItemsPurchased[i].value);
} // line closes if statement
} // line closes for loop
for (i = 0; i < itemsSelectedValues.length; i++) {
// line above is suppose to loop through the now full array that has the items value names stored
total = total + catalogToLookFrom[itemsSelectedValues];
// this line is suppose to set variable total to itself + the value of the item that's stored in array shoppingItems. It's suppose to do this each time through the loop. This is where the problem lies.
} // closes for loop
console.log(catalogToLookFrom[itemsSelectedValues]);
return total;
} // line closes listOfCheckedItems function
function getOrderTotal() {
listOfCheckedItems(shoppingItems);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="cash-register.html" method="post">
<p style="color:#A569BD; font-size:20px; text-decoration:underline; margin-left:20px;">Department Store Items</p>
<input type="checkbox" name="products[]" value="Stainless Steel Cooking Pot">Stainless Steel Cooking Pot - .99<br>
<input type="checkbox" name="products[]" value="Mini Stainless Steel Blender">Mini Stainless Steel Blender - .99<br>
<input type="checkbox" name="products[]" value="Kitchen Towel Set">Kitchen Towel Set - .99<br>
<input type="checkbox" name="products[]" value="Large Tan Coffee Mug">Large Tan Coffee Mug - .49<br>
<input type="checkbox" name="products[]" value="5 Round Dinner Plate Set">5 Round Dinner Plate Set - .99<br>
<input type="checkbox" name="products[]" value="Salt and Pepper Shaker Set">Salt and Pepper Shaker Set - .99<br>
<input type="checkbox" name="products[]" value="Large Blue Broom">Large Blue Broom - .98<br>
<input type="checkbox" name="products[]" value="Pink Soap Dish">Pink Soap Dish - .5<br>
<input type="checkbox" name="products[]" value="Silver Bathroom Trash Can">Silver Bathroom Trash Can - .99<br>
<input type="checkbox" name="products[]" value="Silk Black Bathroom Robe">Silk Black Bathroom Robe - .99
<br/>
<br/>
<button type="button" name="yourOrder" onclick="getOrderTotal()">Submit</button>
<br/>
<br/>
</form>
您可以在此处使用不同且更简洁的逻辑。
使用 jQuery 选择元素后,您可以使用 .each()
遍历这些对象,其中 this
上下文将直接是元素。
此外,您不需要包含值的数组,您可以简单地在 each()
函数内求和,将选择的值传递给 shoppingItems
的数组以您检索 $ 值的方式。在迭代结束时,您将获得总值。
正如我在回答的评论中所说,一旦您在 jQuery 中选择了已选中的那些,则无需检查 this.checked === true
。
请看一下:
var shoppingItems = {
"Stainless Steel Cooking Pot": 29.99,
"Mini Stainless Steel Blender": 19.99,
"Kitchen Towel Set": 7.99,
"Large Tan Coffee Mug": 5.49,
"5 Round Dinner Plate Set": 5.99,
"Salt and Pepper Shaker Set": 1.99,
"Large Blue Broom": 3.98,
"Pink Soap Dish": 2.50,
"Silver Bathroom Trash Can": 6.99,
"Silk Black Bathroom Robe": 9.99,
};
function listOfCheckedItems(catalogToLookFrom) {
var yourItemsPurchased = $("input:checkbox:checked");
var totalValue = 0;
yourItemsPurchased.each(function(){
totalValue += parseFloat(shoppingItems[this.value]);
})
console.log(totalValue);
return totalValue;
}
function getOrderTotal() {
listOfCheckedItems(shoppingItems);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="cash-register.html" method="post">
<p style="color:#A569BD; font-size:20px; text-decoration:underline; margin-left:20px;">Department Store Items</p>
<input type="checkbox" name="products[]" value="Stainless Steel Cooking Pot">Stainless Steel Cooking Pot - .99<br>
<input type="checkbox" name="products[]" value="Mini Stainless Steel Blender">Mini Stainless Steel Blender - .99<br>
<input type="checkbox" name="products[]" value="Kitchen Towel Set">Kitchen Towel Set - .99<br>
<input type="checkbox" name="products[]" value="Large Tan Coffee Mug">Large Tan Coffee Mug - .49<br>
<input type="checkbox" name="products[]" value="5 Round Dinner Plate Set">5 Round Dinner Plate Set - .99<br>
<input type="checkbox" name="products[]" value="Salt and Pepper Shaker Set">Salt and Pepper Shaker Set - .99<br>
<input type="checkbox" name="products[]" value="Large Blue Broom">Large Blue Broom - .98<br>
<input type="checkbox" name="products[]" value="Pink Soap Dish">Pink Soap Dish - .5<br>
<input type="checkbox" name="products[]" value="Silver Bathroom Trash Can">Silver Bathroom Trash Can - .99<br>
<input type="checkbox" name="products[]" value="Silk Black Bathroom Robe">Silk Black Bathroom Robe - .99
<br/>
<br/>
<button type="button" name="yourOrder" onclick="getOrderTotal()">Submit</button>
<br/>
<br/>
</form>
你忘记了循环中的[i]
total = total + catalogToLookFrom[itemsSelectedValues[i]];
这是一个非常简化的版本
$(function() { // when the page loads
$("input:checkbox").on("change", function() { // each time something changes
var total = 0;
$("input[type=checkbox]:checked").each(function() { // only checked boxes
total += shoppingItems[this.value]; // the prices are already numbers
})
$("#total").text(total.toFixed(2)); // 2 decimals
}).change(); // run at load time to calculate
})
// This Array Object holds the items name and prices the user selects from
var shoppingItems = {
"Stainless Steel Cooking Pot": 29.99,
"Mini Stainless Steel Blender": 19.99,
"Kitchen Towel Set": 7.99,
"Large Tan Coffee Mug": 5.49,
"5 Round Dinner Plate Set": 5.99,
"Salt and Pepper Shaker Set": 1.99,
"Large Blue Broom": 3.98,
"Pink Soap Dish": 2.50,
"Silver Bathroom Trash Can": 6.99,
"Silk Black Bathroom Robe": 9.99,
};
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="cash-register.html" method="post">
<p style="color:#A569BD; font-size:20px; text-decoration:underline; margin-left:20px;">Department Store Items</p>
<input type="checkbox" name="products[]" value="Stainless Steel Cooking Pot">Stainless Steel Cooking Pot - .99<br>
<input type="checkbox" name="products[]" value="Mini Stainless Steel Blender">Mini Stainless Steel Blender - .99<br>
<input type="checkbox" name="products[]" value="Kitchen Towel Set">Kitchen Towel Set - .99<br>
<input type="checkbox" name="products[]" value="Large Tan Coffee Mug">Large Tan Coffee Mug - .49<br>
<input type="checkbox" name="products[]" value="5 Round Dinner Plate Set">5 Round Dinner Plate Set - .99<br>
<input type="checkbox" name="products[]" value="Salt and Pepper Shaker Set">Salt and Pepper Shaker Set - .99<br>
<input type="checkbox" name="products[]" value="Large Blue Broom">Large Blue Broom - .98<br>
<input type="checkbox" name="products[]" value="Pink Soap Dish">Pink Soap Dish - .5<br>
<input type="checkbox" name="products[]" value="Silver Bathroom Trash Can">Silver Bathroom Trash Can - .99<br>
<input type="checkbox" name="products[]" value="Silk Black Bathroom Robe">Silk Black Bathroom Robe - .99
<br/>
<br/>
<button type="button" name="yourOrder">Submit</button>
<br/>
<br/>
</form>
Total: $<span id="total"></span>
您可以使用 array.reduce
将您的代码简化为一行代码(请参阅 docs 以减少):
$("input:checkbox:checked").toArray().reduce((a, e) => a + catalog[e.value], 0)
这首先对您的 jQ 集合调用 toArray()
以将其转换为原始数组。在此数组上调用的 reduce
函数将数组 (e
) 中的每个元素传递给回调函数。 reduce
还接受第二个参数 0
,它累加最终总数。此总数重复传递到 reduce
回调的 a
参数中,并添加到从 catalog
对象中获取的每个 e
值。
var shoppingItems = {
"Stainless Steel Cooking Pot": 29.99,
"Mini Stainless Steel Blender": 19.99,
"Kitchen Towel Set": 7.99,
"Large Tan Coffee Mug": 5.49,
"5 Round Dinner Plate Set": 5.99,
"Salt and Pepper Shaker Set": 1.99,
"Large Blue Broom": 3.98,
"Pink Soap Dish": 2.50,
"Silver Bathroom Trash Can": 6.99,
"Silk Black Bathroom Robe": 9.99,
};
const listOfCheckedItems = catalog =>
$("input:checkbox:checked").toArray().reduce((a, e) => a + catalog[e.value], 0)
;
function getOrderTotal() {
console.log(listOfCheckedItems(shoppingItems));
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form action="cash-register.html" method="post">
<p style="color:#A569BD; font-size:20px; text-decoration:underline; margin-left:20px;">Department Store Items</p>
<input type="checkbox" name="products[]" value="Stainless Steel Cooking Pot">Stainless Steel Cooking Pot - .99<br>
<input type="checkbox" name="products[]" value="Mini Stainless Steel Blender">Mini Stainless Steel Blender - .99<br>
<input type="checkbox" name="products[]" value="Kitchen Towel Set">Kitchen Towel Set - .99<br>
<input type="checkbox" name="products[]" value="Large Tan Coffee Mug">Large Tan Coffee Mug - .49<br>
<input type="checkbox" name="products[]" value="5 Round Dinner Plate Set">5 Round Dinner Plate Set - .99<br>
<input type="checkbox" name="products[]" value="Salt and Pepper Shaker Set">Salt and Pepper Shaker Set - .99<br>
<input type="checkbox" name="products[]" value="Large Blue Broom">Large Blue Broom - .98<br>
<input type="checkbox" name="products[]" value="Pink Soap Dish">Pink Soap Dish - .5<br>
<input type="checkbox" name="products[]" value="Silver Bathroom Trash Can">Silver Bathroom Trash Can - .99<br>
<input type="checkbox" name="products[]" value="Silk Black Bathroom Robe">Silk Black Bathroom Robe - .99
<br/>
<br/>
<button type="button" name="yourOrder" onclick="getOrderTotal()">Submit</button>
<br/>
<br/>
</form>