2014-01-20 7 views
0

Привет У меня есть массив, который выглядит как:Первый неотрицательным элемент массива

hrarray = [-9,-7,0,3,7,8] 

Я пытался разработать функцию, которая выбирает первую неотрицательные (. Вкл 0) номер в массиве и возвращает индекс (var elemid):

for (var i = 0, len=hrArray.length; i<len; i++) { 
var num = hrArray[i]; 
if(num > 0) { 
var elemid = i; //returns first non-negative element index 
} 
else if(num < 0) {} 

Является ли мой код логическим?

ответ

0

Я не вижу, чтобы вы возвращали что-либо.

Вы можете получить первый неотрицательное с одной строкой:

for (var i = 0, len = arr.length; i < len && arr[i] < 0; i++); 

В основном, мы размещаем чек на негативах в внимайте-петле. Он сломается, как только он найдет неотрицательный и, следовательно, возвращает i этого первого неотрицательного.

Update # 1 (для использования в функции):

function getFirstNonNegative(arr) { 
    for (var i = 0, len = arr.length; i < len && arr[i] < 0; i++); 
    // Use a ternary operator 
    return (i === len) ? -1 : i; // If i === len then the entire array is negative 
} 
+0

отлично - если я хочу подать это, то я могу получить соответствующий другой массив (называемый список), могу ли я назвать это как список [getFirstNegative (arr)]? – user3213563

+0

Yep - просто убедитесь, что вы придерживаетесь этого в функции. Проверьте мое обновление. – linstantnoodles

+0

Добавили еще одно обновление! – linstantnoodles

0

Основная проблема, которую я вижу, что вы не вырывались из цикла, когда вы найдете неотрицательное значение. Это можно сделать с помощью инструкции break, или если вы хотите немедленно выйти из функции, оператор return.

Функция должна выглядеть немного так:

function findNonNegative(arry) { 
    for (var i = 0, len = arry.length; i < len; i++) { 
     if(arry[i] >= 0) 
      return i; 
    } 

    return -1; 
} 

Обратите внимание, что этот метод возвращает -1 если не неотрицательные элементы не найдены.

И с небольшой настройки, это может быть сокращен до:

function findNonNegative(arry) { 
    for (var i = 0; arry[i] < 0; i++); 
    return i < arry.length ? i : -1; 
} 

Эта версия использует поведения петли for обоим проверить наши ценности внутри цикла и вспыхнет один раз желаемое значение найденный. Это также зависит от того, что x < y всегда возвращает false, если x - undefined, что гарантирует, что мы не закончим бесконечный цикл. Последнее условное выражение заключается в том, чтобы сделать возвращаемое значение равным -1, если не было найдено неотрицательных элементов; который может быть уменьшен до return i;, если вы в порядке с возвратным значением arry.length в этом случае.

+0

Ницца!Вы сделали одиночный for-loop, а также. Я думаю, что 'length' check не требуется, поскольку x linstantnoodles

+0

@linstantnoodles Исправить. В конце концов он останавливается после тестирования 'arr [i]' when 'i == length', который на большинстве языков программирования приведет к исключению вне диапазона. –

0

Ваш код присваивает элементу последний неотрицательный массив. Попробуйте следующее:

var elemid=-1; // elemid should be declared outside the for statement 
for (var i = 0, len=hrArray.length; i<len; i++) { 
    if(hrArray[i] > 0) { 
     elemid = i; //returns first non-negative element index 
     break; 
    } 
} 
Смежные вопросы