2014-01-10 5 views
0

Не имеет значения для Javascript, может ли кто-нибудь сказать мне, почему эта простая функция сравнения строк/строк массива всегда возвращает false? Они оба типа string, и данные одинаковы, цикл должен абсолютно возвращать true. Возможная синтаксическая ошибка? Также есть более простой способ выполнить эту проверку.Функция всегда возвращает false

function imageDuplicate(fileName) 
{ 
    $.each(previewImagesArray, function(index) 
    { 
     if(previewImagesArray[index].name == fileName) 
      return true; 
    }); 
    return false 
} 

Заранее спасибо.

+0

Это будет быстрее и меньше коды, если вы просто использовать 'for' заявление. 'for (var i = 0, a = previewImagesArray; i

ответ

10

Вы возвращаете истину от анонимной внутренней функции, а не из imageDuplicate, вместо этого использовать переменный флаг, как показано ниже

function imageDuplicate(fileName) { 
    var valid = false; 
    $.each(previewImagesArray, function (index) { 
     if (previewImagesArray[index].name == fileName) { 
      valid = true; 
      //to stop the iteration 
      return false 
     } 
    }); 
    return valid 
} 
+0

Gotcha, спасибо, друг. – Spark

+0

@Spark: Если этот ответ решает вашу проблему, пожалуйста, «Примите» это как правильный ответ. – leticia

+0

Есть 15-минутный таймер при принятии ответа. – Spark

8

Как об этом вместо:

function imageDuplicate(fileName) 
{ 
    return previewImagesArray.some(function(item) 
    { 
     return item.name === fileName; 
    }); 
} 

Важен: это будет работать на IE9 +, если вам это нужно для работы в старой версии IE, пожалуйста, следуйте инструкциям по заполнению полиса here.

Другие образцы сообщение:

javascript find an object with specific properties in an array

+0

Из моего POV он должен дать вам лучшую производительность – Dalorzo

+4

+1 для редко используемых 'some'. – Andy

0

Код внутри function(index) представляет собой отдельную функцию, вложенный в imageDuplicate. Возвращаемое значение этой функции будет обрабатываться .each() по своему усмотрению.

Как таковое, единственным оператором, возвращающимся из вашей внешней функции, является ваш return false.

Как другие ответы иллюстрируют в коде, вы можете объявить переменную в области imageDuplicate и иметь внутреннюю функцию доступа и изменить это значение, чтобы получить желаемый эффект.

1

Как указано в комментарии Возврат из каждого цикла, не возвращается из функции.

Try что-то вроде этого

function imageDuplicate(fileName) 
{ 
    var isDuplicate = false; 
    $.each(previewImagesArray, function(index) 
    { 
     if(previewImagesArray[index].name == fileName){ 
      isDuplicate = true; 
      return false; //exit from each loop 
     } 
    }); 
    return isDuplicate; 
} 
0

один подстройки будет использовать значение непосредственно

$.each(previewImagesArray, function (index, value) { 
     if (value.name == fileName) { 
      ... 
     } 
    }); 
Смежные вопросы