2013-12-23 6 views
1

У меня есть массив, который будет иметь только одно ненулевое значение вместе с другими 0 значениями за раз. Например, это может бытьJavascript - Как я могу получить ненулевое значение из массива?

[0,0,0,0,0,0,0,1234,0,0,0] 
// or 
[0,0,2823,0,0,0,0,0,0,0,0] 
//... 

Мой вопрос: как я могу получить это ненулевое значение из массива с помощью javascript.

Я знаю, что могу перебирать массив и возвращать ненулевое значение, как только оно будет найдено, но мне было интересно, есть ли какие-либо функции, предоставляемые javascript для этого?

+3

@VisioN дал хороший ответ, но следует отметить, что * что-то * будет перебирать массив. Функциональный подход в этом ответе хорош тем, что он «закрывает» итерацию, но алгоритмически это по-прежнему реальная стоимость. – Pointy

+0

@Pointy зависит. Может ли функциональный подход быть векторизован лучше, чем итеративный подход? (Я думаю, что все наоборот, итеративный будет быстрее). –

+0

@JanDvorak хорошо, но если вы делаете традиционный анализ сложности, поиск значения в неупорядоченном линейном списке - это операция * O (n) *. – Pointy

ответ

7

Вы можете отфильтровать его из массива:

[0,0,0,0,0,0,0,1234,0,0,0].filter(function(x) { return x; }).pop(); // 1234 

Как @Sarath упоминалось в комментариях, если ваш первоначальный массив может иметь другие falsy не числовые значения (как false, undefined, '', и т.д.) вы можете добавить строгое сравнение:

[0,0,0,0,0,0,0,1234,0,0,0].filter(function(x) { return x !== 0; }).pop(); 

Еще один короткий решение для числовых массивов с использованием метода reduce:

[0,0,0,0,0,0,0,1234,0,0,0].reduce(function(a, b) { return a + b; }); // 1234 

N.B .: Проверьте совместимость браузера для filter и reduce методов и использовать polyfills при необходимости.

+1

@JanDvorak Спасибо :) Я только что скопировал раздел ** N.B. ** из [здесь] (http://stackoverflow.com/a/20743730/1249581). – VisioN

+1

лучше user 'return x! == 0' что, если он хочет' '', false и т. Д. – Sarath

+1

@Sarath Я принял числовой массив –

1

Просто думал, что я бы предложить альтернативное решение с учетом ограничений на ваш вопрос:

var foo = [0,0,0,0,0,0,0,1234,0,0,0], 
    bar = [0,0,2823,0,0,0,0,0,0,0,0]; 

console.log(
    Math.max.apply(null, foo), // 1234 
    Math.max.apply(null, bar) // 2823 
); 
+0

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

+0

@VisioN Не видел необходимости расширять пример, если это не было оговорено в вопросе. Я думаю, что это достаточно иллюстрирует, что есть разные способы мышления - это было все, что я получал;) – Emissary

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