2015-01-03 70 views
0

我希望終止地圖功能時,如果條件通過終止外映射函數在JavaScript

dataset.Categories.map(function (item) { 
    if(Object.keys(item)[0] == current_category){ 
     return false; 
    } 
    else 
     category_position++; 
}); 

這裏數據集是一個對象。即使條件通過,map函數也會運行整個長度。在您的實際問題之前

+1

多個按鍵的順序AFAIK你不能阻止問題它。你可能會短路。 – Sirko

+0

@Sirko你可以詳細說明嗎? –

+0

你能提供一個你的變量數據集的例子嗎? – user1428716

回答

4

它看起來像你真的想用Array.prototype.some

dataset.Categories.some(function (item) { 
    if (Object.keys(item)[0] == current_category) { 
     return true; // this will end the `some` 
    } 
    ++category_position; 
}); 

此外,您的測試可以得到更好的書面形式

if (item.hasOwnProperty(current_category)) { // etc 

因爲這避免了涉及上對象

+0

@Teemu這是一個脫離我貼的編輯!謝謝 –

1

東西:

  • 只要你不創建一個新的數組,你可能需要使用forEach()
  • 我不記得看到任何關於這些保證處理元素的順序的迭代器函數。

這beeing說來修復您的代碼,我想介紹一個變量帶有短路(因爲據我所知這些迭代器功能不能被取消):

var done = false, 
    category_position = 0; 
dataset.Categories.map(function (item) { 
    if(done) { 
    return; 
    } 

    if(Object.keys(item)[0] == current_category){ 
    done = true 
    } else { 
    category_position += 1; 
    } 
}); 

除此之外,我認爲,這僅僅是for循環將最適合你的位置:

var category_position; 
for(category_position=0; category_position<dataset.Categories.length; category_position++) { 
    if(Object.keys(dataset.Categories[ category_position ])[0] == current_category){ 
    break; 
    } 
} 
+1

你需要用category_position替換我。 –

+1

關於你關於迭代函數處理順序的觀點,實際上'.forEach()'和'.map()'都按升序索引順序處理元素(跳過不存在的元素)。如果他們不這樣做,那麼他們的用處就會減少很多,再加上他們自己的實現將不那麼簡單。 – nnnnnn