如何终止forEachObject循环?

isu*_*uru 5 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;
            } 
        }
    });  
Run Code Online (Sandbox Code Playgroud)

ste*_*425 6

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

因此,与,你可以使用所有的普通阵列itteration方法,如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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

显然这是伪代码.基本上它会循环所有对象并在您返回时中止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;
        }
    });
Run Code Online (Sandbox Code Playgroud)

排列一些文档

fabricjs getObjects源码


编辑:在旁注hasOwnProperty不应该检查我不认为.只要obj定义了,那么访问不存在的属性将返回undefined.哪个会=== true检查失败.