2016-10-11 5 views
0

Предположим, у меня есть 3 текстовых поля в cshtml. То, что я пытаюсь сделать в Javascript, является следующим:Как проверить, не имеет ли только одно значение в Javascript?

Проверьте, не ЛЮБЫЕ из этих 3 значений и ТОЛЬКО ИХ не являются нулевыми.

Единственный способ, которым я могу думать делаем это вручную:

if ((val1 & !val2 & !val3) || (!val1 & val2 & !val3) || (!val1 & !val2 & val3)) 

Это нормально, если это небольшое количество текстовых полей, но если такое число вырастает до 10+, это может стать хлопоты.

Есть ли эффективный способ реализации такой логики в Javascript независимо от того, сколько текстовых полей мы имеем в виду?

+1

Почему флажок когда-либо иметь значение 'null', она всегда должна возвращать строку? – adeneo

+1

И да, есть хотя бы несколько эффективных способов написания такого кода, используя общий селектор и 'Array.some' и т. Д. – adeneo

+0

@adeneo Нет флажков, только текстовые поля. –

ответ

1

Вы можете использовать .reduce:

var nonEmpty = [val1, val2, val3].reduce(((c, v) => c += (v !== "")), 0); 
if (nonEmpty === 1) { 
    // exactly one is not empty 
} 

Любой другой способ подсчета непустых входов и проверка того, что счетчик равен 1, тоже будет работать тоже.

В этом .reduce() код использует функцию «стрелка», которая увеличивает счетчик (c), когда значение не является пустой строкой. (Если вы хотите, чтобы проверить нуль, вы можете сделать это вместо того, конечно.) Вы можете использовать простые старомодные функции тоже:

var nonEmpty = [val1, val2, val3].reduce(function(c, v) { 
    return c += (v !== ""); 
}, 0); 

.reduce() функция передаются 2 параметром: эта функцию обратного вызова и тому начальное значение c (ноль в этом случае). Возвращаемое значение будет final значение c, возвращенный последним обращением к обратному вызову.

+0

Я считаю, что это может быть именно то, что мне нужно. Не могли бы вы вкратце объяснить логику внутри метода сокращения, поэтому я могу получить представление о ее правильном использовании. –

+0

@VadzimSavenok да я продлю ответ – Pointy

1

просто держать в го значения массива не равно нулю, а затем подсчитать сколько осталось:

var arr = ["hello", "", ""]; 

var result = arr.filter(x => x !== "").length; 

if (result === 1) console.log("exactly one is not empty"); 
+0

Это часть того, что мне нужно, но мне также нужно убедиться, что элемент ТОЧНО ОДИН не пуст. В вашем случае звучит, что элемент «МЕНЬШИЙ ОДИН» не пуст. –

+0

все сделано, я передумал алгоритм –

+0

Upvote для краткости и эффективности. –

1

Вы можете напрямую просмотреть текстовые поля для значений. Если вы работаете с бритвой, вы можете использовать JQuery. Также это решение будет работать для любого количества текстовых полей.

var count=0; 
 
var isExactlyOneNotEmpty= 
 
    function(){ 
 
    $('input[name="text[]"]').each(function() { 
 
     if($(this).val()!="") 
 
     { 
 
      ++count; 
 
     } 
 
    }); 
 
    if(count==1) 
 
    return true 
 
    else 
 
    return false; 
 
    } 
 
var check=isExactlyOneNotEmpty(); 
 
alert(check); 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<input type="text" id="text1" name="text[]"> 
 
<input type="text" id="text2" name="text[]" value="test"> 
 
<input type="text" id="text3" name="text[]">

+0

Upvote для усилий и хороший алгоритм логики. –

0

Вы можете использовать оператор Exclusive OR (XOR) для этого. Давайте посмотрим, что мы можем получить с ним:

enter image description here

Однако единственный результат, который не соответствует вашим потребностям является последним (он возвращает true, когда все они также true).

Чтобы решить эту проблему, вы можете проверить, не совпадают ли все значения одновременно. Подводя итог, это выражение делает трюк:

if(!(val1 && val2 && val3) && (val1^val2^val3))

+1

Это хорошо для небольших значений, но если число увеличивается до 10 или 20, оно становится длинной. –

+0

Вы правы, я пропустил часть «независимо от того, сколько текстовых полей» – demarchisd

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