2016-04-08 122 views
4

這個問題屬於fabricJS和canvas。在以下情況下檢查是否有任何物體屬性爲真(obj.background == true)。在畫布上可以有幾個圖像。在第一次檢測對象之後,我想要終止循環。我如何做到這一點?我大使用return false;但不起作用。這是功能。如何終止forEachObject循環?

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

你可以在它裏面有一個'flag'。但是如果你想終止一個循環,請使用'for-loop ... break;' – Rayon

+0

你試過'continue n;'嗎? – Phil795

+1

可能''forEachObject'不是爲了在每個對象對'function(obj)'執行之前終止循環而設計的。你可能要考慮使用正常的for循環。 – Ian

回答

4

現在我還沒有使用FabricJS(等待已經投票的垃圾郵件),看看源碼有一個getObjects()方法。它所做的是返回一個對象數組,而不是像forEachObject()這樣的自定義迭代器。

因此,你可以使用所有正常的數組迭代方法,如forEach(),some(),every()等,這將允許你做你想做的事情。

所以我的理解是你想檢查對象是否是圖像,如果它的背景屬性爲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檢查失敗。

+1

還有什麼可以將對象類型傳遞給getObjects()並獲取所需的對象數組。例如canvas.getObjects('image')爲你提供了一個object.type ==''image'的數組:':') –