2016-12-25 3 views
6

Если найдено three, оно должно возвратить true и остановить итерацию. В противном случае возвратите return false, если не найдено.Как остановить цикл после его обнаружения?

Я использую filter() - это неправильный подход к использованию?

var data = [ 
    'one', 
    'two', 
    'three', 
    'four', 
    'three', 
    'five', 
]; 

found = data.filter(function(x) { 
    console.log(x); 
    return x == "three"; 
}); 

console.log(found); 

Демо: https://jsbin.com/dimolimayi/edit?js,console

+1

'фильтр()' метод Запускает функцию ** давать по каждому пункту ** в массиве и возвращает массив всех элементов, для которых функция возвращает значение ИСТИНА; Полезная ссылка: https://coderwall.com/p/_ggh2w/the-array-native-every-filter-map-some-foreach-methods –

+0

Ничего плохого в использовании 'filter', но вы можете использовать ['. find() '] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find), чтобы удовлетворить ваши требования ... Related: http://stackoverflow.com/questions/23614054/javascript-нюансы-of-myarray-foreach-vs-for-loop – Mottie

ответ

6

Вы можете использовать array#some в этом контексте,

var data = [ 
    'one', 
    'two', 
    'three', 
    'four', 
    'three', 
    'five', 
]; 

found = data.some(function(x) { 
    return x == "three"; 
}); 

console.log(found); // true or false 

Если вы используете filter, то массив будет фильтроваться на основе truthy значения, возвращенного внутри в callBack функция. Поэтому, если какие-либо совпадения нашли смысл, если возвращаемая функция со значением true, то элемент на этой конкретной итерации будет собран в array и, наконец, массив будет возвращен.

Следовательно, в вашем случае ["three", "theree"] будет возвращен в результате. Если у вас нет "three", тогда будет возвращен пустой массив. В этом контексте вам нужно сделать дополнительную проверку, чтобы найти правдивое значение в результате.

Для примера:

var res = arr.filter(itm => someCondition); 
var res = !!res.length; 
console.log(res); //true or false. 

Таким образом, чтобы избежать, что за убийство ситуации мы используем массив # некоторые из них.

+0

Спасибо, чтобы улучшить ваш ответ - почему мое решение неверно, что я использовал 'filter' –

+1

Вы не *" должны используйте «* .. это всего лишь один возможный подход – charlietfl

+0

@ I'll-Be-Back Я редактирую это. Дайте мне минутку. –

0

var data = [ 
 
    'one', 
 
    'two', 
 
    'three', 
 
    'four', 
 
    'three', 
 
    'five', 
 
]; 
 

 
for(var i=0;i<data.length;i++){ 
 
    console.log(data[i]); 
 
    if(data[i]=="three"){ 
 
    var found=data[i]; 
 
    break; 
 
    } 
 
} 
 

 
console.log(found);

+0

Не забудьте указать 'found' в коде. – Mottie

+0

извините. и спасибо за то, что – ab29007

0

Вы должны возвратить ложь, чтобы выйти из функции, но вы уже используете оператор возврата в функцию фильтра, и вы не можете использовать 2 обратные заявления ... Еще одно решение я придумал с такой:

var data = [ 
    'one', 
    'two', 
    'three', 
    'four', 
    'three', 
    'five', 
]; 

var filteredData = []; 

function a(i,e){ 
    console.log(e); 

    if(e == "three"){ 
    filteredData.push(e); 
    return false; 
    } 
} 

$(data).each(a); 
console.log(filteredData); 

Это сломается, как только она попадает «три», а также сохраняет его в filteredData массиве, так что вы можете использовать его в будущем ... Надеюсь, что это помогает ....

0

Простой подход.

var data = [ 
 
     'one', 
 
     'two', 
 
     'three', 
 
     'four', 
 
     'three', 
 
     'five', 
 
    ]; 
 
    
 
    
 
    found = data.indexOf('three') == -1 ? false : true; 
 
    console.log(found);

+2

'indexOf' также выполнит цикл под капотом, и переданное значение будет помещено в строку проверки' === '. Вы можете увидеть его алгоритм в документации ecma. –

+1

@RajaprabhuAravindasamy, спасибо за разъяснение. Кажется, все петли под капотом. :) – sinisake

Смежные вопросы