2015-01-03 46 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