2016-09-18 5 views
0

Здесь у меня есть функция. Он принимает массив объекта и определенное значение. Массив выполняется итерацией с использованием метода forEach, чтобы гарантировать, что предоставленное значение уже существует в любом из объектов в array.If нашел он возвращает FALSE, или он должен вернуть true.But хотя она возвращает FALSE, остальная часть кода ALSE запускается на выполнение результатов в возвращении TRUE, все time.How я могу вернуть только FALSE/TRUE,return TRUE или FALSE от функции

if(find_value_in_obj(all_selected,current.value)){ 
     all_selected.push({select_elem:current,value:current.value}); 
     console.log(all_selected); 
    }else{ 

     alert("you already selected the value"); 
    } 

    function find_value_in_obj(arr_obj,value){ 

     arr_obj.forEach(function(elem,index,array){ 

      if(elem.value == value){ 
       console.log('found it '); 
       return false; 
      } 
     }); 
     console.log("i am her"); // though value already exists and should returned ,it gets executed results in returning TRUE instead 

     return true; 
    } 
+3

'return false;' возвращается только из обратного вызова, который вы передаете 'forEach', это не влияет на' find_value_in_obj'. Вы должны изучить ['Array # some'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some). –

ответ

1

forEach Итерирует все значения. Вы должны использовать .some().

А с помощью some просто один лайнер, вы на самом деле не нужно, чтобы создать помощника для этого, например (от MDN):

console.log([2, 5, 8, 1, 4].some(elem => elem > 10)); // false 
 
console.log([12, 5, 8, 1, 4].some(elem => elem > 10)); // true

2

forEach не может быть разбит в середине своей итерации, как обычный цикл for. Вместо этого используйте обычный цикл for. Или, если вы используете ES6, тогда вы можете добиться того же, используя .find().

function find_value_in_obj(arr_obj,value){ 
    return !!!arr_obj.find(itm => itm == value); 
} 

Как предложил Феликсу, вы могли бы использовать Array.prototype.some также.

function find_value_in_obj(arr_obj,value){ 
    return !arr_obj.some(itm => itm == value); 
} 
+0

Но find() - это функция es6, а функции es6 не полностью поддерживаются в некоторых более старых версиях браузеров .... :( –

1

Вы можете также попробуйте использовать фильтр, который является более подходящим и чистым.

if(find_value_in_obj(all_selected,current.value)){ 
    all_selected.push({select_elem:current,value:current.value}); 
    console.log(all_selected); 
}else{ 

    alert("you already selected the value"); 
} 

function find_value_in_obj(arr_obj,value){ 

    var resultArray = arr_obj.filter(function(elem,index,array){ 
     return elem.value == value; 
    }); 

    if(resultArray.length > 0){ 
     return false; 
    } 
    console.log("i am her"); // though value already exists and should returned ,it gets executed results in returning TRUE instead 

    return true; 
} 
Смежные вопросы