Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从调用forEach()数组方法的方法返回。JavaScript_Javascript_Arrays_Foreach_Ecmascript 5 - Fatal编程技术网

从调用forEach()数组方法的方法返回。JavaScript

从调用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

我使用的是从JavaScript中的数组调用的forEach()方法。当我写
返回时
在为数组中的每个元素调用的方法中的某个地方,我从为特定元素调用的方法返回,仅此而已。但我真正想要的是从数组调用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
,则迭代停止并