从调用forEach()数组方法的方法返回。JavaScript
我使用的是从JavaScript中的数组调用的forEach()方法。当我写从调用forEach()数组方法的方法返回。JavaScript,javascript,arrays,foreach,ecmascript-5,Javascript,Arrays,Foreach,Ecmascript 5,我使用的是从JavaScript中的数组调用的forEach()方法。当我写返回时在为数组中的每个元素调用的方法中的某个地方,我从为特定元素调用的方法返回,仅此而已。但我真正想要的是从数组调用forEach()的方法返回。代码如下: function addToCart(pizza, size) { Cart.forEach(function(cartItem) { if(pizzaAndSizeAreTheSame(car
返回时
在为数组中的每个元素调用的方法中的某个地方,我从为特定元素调用的方法返回,仅此而已。但我真正想要的是从数组调用forEach()的方法返回。代码如下:
function addToCart(pizza, size)
{
Cart.forEach(function(cartItem)
{
if(pizzaAndSizeAreTheSame(cartItem, pizza, size))
{
cartItem.quantity++;
updateCart();
//Want go out from addToCart if this return is reached
return;
}
});
//Don`t want the code run after return;
Cart.push
({
pizza: pizza,
size: size,
quantity: 1
});
updateCart();
}
到目前为止,我提出了以下解决方案:
function addToCart(pizza, size)
{
var leaveTheMethod = false;
Cart.forEach(function(cartItem)
{
if(pizzaAndSizeAreTheSame(cartItem, pizza, size))
{
cartItem.quantity++;
updateCart();
leveTheMethod = true;
}
});
if(leaveTheMethod)
{return;}
//Don`t want the code run after return;
Cart.push
({
pizza: pizza,
size: size,
quantity: 1
});
updateCart();
}
我想知道有没有更好的办法来解决这个问题
与这个问题相比:
我对了解forEach()循环中的新方法不感兴趣,我不想脱离forEach(),而是不想包含forEach()调用方方法。引用:
function addToCart(pizza, size) {
var res = Cart.some(function(cartItem)) {
if(pizzaAndSizeAreTheSame(cartItem, pizza, size)) {
cartItem.quantity++;
updateCart();
//Want go out from addToCart if this return is reached
return true;
}
return false;
});
if(res) {
return;
}
//Don`t want the code run after return;
Cart.push({
pizza: pizza,
size: size,
quantity: 1
});
updateCart();
}
除了抛出异常之外,没有其他方法可以停止或中断forEach()循环。如果需要这样的行为,forEach()方法是错误的工具,请使用普通循环。如果您正在测试数组元素的谓词,并且需要一个布尔返回值,那么可以使用each()或some()。如果可用,新方法find()或findIndex()也可以用于在true谓词上提前终止
话虽如此,我相信您设置一个标志以退出函数的解决方案是最合适和最简单的。引用:
除了抛出异常之外,没有其他方法可以停止或中断forEach()循环。如果需要这样的行为,forEach()方法是错误的工具,请使用普通循环。如果您正在测试数组元素的谓词,并且需要一个布尔返回值,那么可以使用each()或some()。如果可用,新方法find()或findIndex()也可以用于在true谓词上提前终止
话虽如此,我相信您设置一个标志以返回函数的解决方案是最合适、最简单的。您可以使用
Array\find
执行以下操作:
function addToCart(pizza, size)
{
// find the first item where the condition is true,
// or undefined if there is none
var sameSizeItem = Cart.find(function (item) {
return pizzaAndSizeAreTheSame(item, pizza, size);
});
if (sameSizeItem) {
sameSizeItem.quantity++;
updateCart();
return;
}
Cart.push({
pizza: pizza,
size: size,
quantity: 1
});
updateCart();
}
再进行一点调整,您就可以避免在两个不同的位置使用updateCart()
:
function addToCart(pizza, size)
{
// find the first item where the condition is true,
// or undefined if there is none
var sameSizeItem = Cart.find(function (item) {
return pizzaAndSizeAreTheSame(item, pizza, size);
});
if (sameSizeItem) {
sameSizeItem.quantity++;
} else {
Cart.push({
pizza: pizza,
size: size,
quantity: 1
});
}
updateCart();
}
如果您所针对的环境不都支持
Array#find
,您可以获得一个。您可以使用Array#find
执行以下操作:
function addToCart(pizza, size)
{
// find the first item where the condition is true,
// or undefined if there is none
var sameSizeItem = Cart.find(function (item) {
return pizzaAndSizeAreTheSame(item, pizza, size);
});
if (sameSizeItem) {
sameSizeItem.quantity++;
updateCart();
return;
}
Cart.push({
pizza: pizza,
size: size,
quantity: 1
});
updateCart();
}
再进行一点调整,您就可以避免在两个不同的位置使用updateCart()
:
function addToCart(pizza, size)
{
// find the first item where the condition is true,
// or undefined if there is none
var sameSizeItem = Cart.find(function (item) {
return pizzaAndSizeAreTheSame(item, pizza, size);
});
if (sameSizeItem) {
sameSizeItem.quantity++;
} else {
Cart.push({
pizza: pizza,
size: size,
quantity: 1
});
}
updateCart();
}
如果您所针对的环境不都支持
Array#find
,您可以获得一个。您可以通过使购物车成为具有添加方法和数量属性的对象来改进。该属性将比萨饼和大小的不同组合作为键,并将它们的数量作为值。这将替换您当前拥有的阵列
然后,您可以直接访问这些属性,而不必进行任何循环,也不需要函数pizzaAndSizeAreTheSame
下面是一个您可以实现的示例:
function Cart(){//将所有购物车功能放在一个对象/构造函数中
//将购物车中的项目列表设置为对象,而不是数组
this.quanties={};
}
//定义购物车原型上的方法
Cart.prototype={
更新:函数(){
//无论你在updateCart中有什么逻辑
},
附加:功能(比萨饼、大小){
var key=pizza+“|”+大小;
this.quanties[key]=(this.quanties[key]| | 0)+1;
这个.update();
},
toArray:function(){//以防您还需要原始格式
返回Object.key(this.quantities).map(function(key){
返回{
数量:此[键],
pizza:key.split(“|”)[0],
大小:键。拆分(“|”)[1]
};
}.bind(这个是数量)
}
};
//演示:创建购物车并向其中添加项目。
购物车=新购物车();
添加(‘四季’、‘中’);
添加(‘四季’、‘中’);
cart.add(‘素食’、‘大’);
console.log(cart.toArray())代码>
.as console wrapper{max height:100%!important;top:0;}
您可以通过使购物车成为具有添加方法和数量
属性的对象来改进。该属性将比萨饼和大小的不同组合作为键,并将它们的数量作为值。这将替换您当前拥有的阵列
然后,您可以直接访问这些属性,而不必进行任何循环,也不需要函数pizzaAndSizeAreTheSame
下面是一个您可以实现的示例:
function Cart(){//将所有购物车功能放在一个对象/构造函数中
//将购物车中的项目列表设置为对象,而不是数组
this.quanties={};
}
//定义购物车原型上的方法
Cart.prototype={
更新:函数(){
//无论你在updateCart中有什么逻辑
},
附加:功能(比萨饼、大小){
var key=pizza+“|”+大小;
this.quanties[key]=(this.quanties[key]| | 0)+1;
这个.update();
},
toArray:function(){//以防您还需要原始格式
返回Object.key(this.quantities).map(function(key){
返回{
数量:此[键],
pizza:key.split(“|”)[0],
大小:键。拆分(“|”)[1]
};
}.bind(这个是数量)
}
};
//演示:创建购物车并向其中添加项目。
购物车=新购物车();
添加(‘四季’、‘中’);
添加(‘四季’、‘中’);
cart.add(‘素食’、‘大’);
console.log(cart.toArray())代码>
.as控制台包装{max height:100%!important;top:0;}
是否比较pizza和sizearethesame
以检查是否找到了什么?如果是这样,则使用或!从语句返回的唯一方法是抛出/catch:Right,。some()
就是您要寻找的。如果回调返回true
,则迭代停止并