如何终止forEachObject循环?

时间:2016-04-08 05:51:05

标签: javascript canvas fabricjs

这个问题属于fabricJS和canvas。在下面的案例中,检查是否存在任何属性为true的对象(obj.background == true)。画布上可以有几个图像。在第一个对象检测之后,我想终止循环。我是怎么做到的我曾使用return false;但不起作用。这是功能。

    canvas.forEachObject(function(obj){
        if(obj.isType('image') && obj.hasOwnProperty('background')){
            if(!obj.background == true){
                alert("true");
                return false;
            } 
        }
    });  

1 个答案:

答案 0 :(得分:6)

现在我还没有使用FabricJS(等待已经下来投票的垃圾邮件),查看来源有一个getObjects()方法。这样做是返回一个对象数组而不是像forEachObject()这样的自定义迭代器。

因此,您可以使用所有常规数组迭代方法,例如forEach()some()every()等,这样您就可以按照自己的意愿行事。

所以我的理解是你要检查对象是否是一个图像,如果它的background属性为true,并在第一次出现时中止循环?这应该做到。

canvas
    .getObjects()
    .some(obj => {
        if (obj.isType('image') && obj.hasOwnProperty('background') && obj.background === true) {
            console.log('Aww shucks, you found me.');
            return true;
        }
    });

显然这是伪代码。 基本上它会循环所有对象并在您返回true时中止。如果任何元素确实返回true,则some的返回值也将为true

在MichałDopieralski评论之后编辑。

我忽略了getObjects可以传递一个类型的事实,并会为您过滤结果。所以使用这些东西变得更简单。

canvas
    .getObjects('image')
    .some(obj => {
        if (obj.background === true) {
            console.log('Aww shucks, you found me.');
            return true;
        }
    });

array some docs

fabricjs getObjects source

编辑: 另一方面,我不认为hasOwnProperty检查不需要。只要定义了obj,那么访问不存在的属性将返回undefined。这将导致=== true检查失败。