Na przykład sprawdzam zmienną pod foo
kątem równości z pewną liczbą wartości. Na przykład,
if( foo == 1 || foo == 3 || foo == 12 ) {
// ...
}
Chodzi o to, że jest to dość dużo kodu do tak banalnego zadania. Wymyśliłem:
if( foo in {1: 1, 3: 1, 12: 1} ) {
// ...
}
ale też to nie do końca mi się podoba, ponieważ muszę nadać zbędne wartości elementom w obiekcie.
Czy ktoś zna przyzwoity sposób sprawdzania równości względem wielu wartości?
javascript
pimvdb
źródło
źródło
Odpowiedzi:
Możesz użyć tablicy i
indexOf
:if ([1,3,12].indexOf(foo) > -1)
źródło
indexOf
jest dostępna tylko od piątej edycji ECMAScript.W ECMA2016 można użyć zawiera metodę. To najczystszy sposób, jaki widziałem. (Obsługiwane przez wszystkie główne przeglądarki, z wyjątkiem IE (Polyfill jest w linku)
if([1,3,12].includes(foo)) { // ... }
źródło
if([a,b,c].includes(foo))
lub ciągówif(['a','b','c'].includes(foo))
if([a,b,c].includes(foo))
ponieważ cudzysłów sprawi, że będzie to ciąg znaków. @HastigZusammenstellenKorzystając z udzielonych odpowiedzi, otrzymałem następujące informacje:
Object.prototype.in = function() { for(var i=0; i<arguments.length; i++) if(arguments[i] == this) return true; return false; }
Można to nazwać tak:
if(foo.in(1, 3, 12)) { // ... }
Edycja: ostatnio natknąłem się na tę „sztuczkę”, która jest przydatna, jeśli wartości są ciągami znaków i nie zawierają znaków specjalnych. W przypadku znaków specjalnych staje się brzydki z powodu ucieczki, a także z tego powodu jest bardziej podatny na błędy.
Mówiąc dokładniej, spowoduje to sprawdzenie dokładnego ciągu, ale z drugiej strony jest to bardziej skomplikowane w przypadku prostego testu równości:
źródło
in
to słowo kluczowe w Javascript. Na przykład uruchomieniefunction in() {}; in()
skutkuje błędem składni, przynajmniej w Firefoksie, i nie jestem pewien, dlaczego twój kod nie. :-)Object.prototype
, ponieważ wpływa tofor (foo in bar)
w niefortunny sposób. Może zmienić to nafunction contains(obj) { for (var i = 1; i < arguments.length; i++) if (arguments[i] === obj) return true; return false; }
i przekazać obiekt jako argument?Object.prototype
czym również wspomniałeś. Jednak wolę ten sposób, ponieważ notacja do sprawdzania jest piękna, po prostufoo.in(1, 2, "test", Infinity)
, łatwa jak ciasto.in()
w zwykły sposób również zawodzi w Chrome, ale prototyp działa ... :)Można napisać
if(foo in L(10,20,30))
, jeśli zdefiniowaćL
jakovar L = function() { var obj = {}; for(var i=0; i<arguments.length; i++) obj[arguments[i]] = null; return obj; };
źródło
'remove' in L(1, 3, 12)
, chociaż tego nie zrobiłeś określić „usuń”, aby umieścić je na liście.Jest to łatwo rozszerzalne i czytelne:
switch (foo) { case 1: case 3: case 12: // ... break case 4: case 5: case 6: // something else break }
Ale niekoniecznie łatwiej :)
źródło
var a = [1,2,3]; if ( a.indexOf( 1 ) !== -1 ) { }
Zauważ, że indexOf nie znajduje się w podstawowym skrypcie ECMAScript. Będziesz potrzebował fragmentu kodu dla IE i być może innych przeglądarek, które nie obsługują Array.prototype.indexOf.
if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(searchElement /*, fromIndex */) { "use strict"; if (this === void 0 || this === null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (len === 0) return -1; var n = 0; if (arguments.length > 0) { n = Number(arguments[1]); if (n !== n) n = 0; else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) n = (n > 0 || -1) * Math.floor(Math.abs(n)); } if (n >= len) return -1; var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); for (; k < len; k++) { if (k in t && t[k] === searchElement) return k; } return -1; }; }
źródło
Teraz możesz mieć lepsze rozwiązanie, aby rozwiązać ten scenariusz, ale w inny sposób, który wolałem.
const arr = [1,3,12] if( arr.includes(foo)) { // it will return true if you `foo` is one of array values else false // code here }
Preferowałem powyższe rozwiązanie niż sprawdzanie indexOf, gdzie również musisz sprawdzić index.
obejmuje dokumenty
if ( arr.indexOf( foo ) !== -1 ) { }
źródło
Ponadto, ponieważ wszystkie wartości, względem których sprawdzasz wynik, są unikalne, możesz również użyć metody Set.prototype.has () .
var valid = [1, 3, 12]; var goodFoo = 3; var badFoo = 55; // Test console.log( new Set(valid).has(goodFoo) ); console.log( new Set(valid).has(badFoo) );
źródło
Podobała mi się zaakceptowana odpowiedź, ale pomyślałem, że fajnie byłoby umożliwić jej również przyjmowanie tablic, więc rozszerzyłem ją do tego:
Object.prototype.isin = function() { for(var i = arguments.length; i--;) { var a = arguments[i]; if(a.constructor === Array) { for(var j = a.length; j--;) if(a[j] == this) return true; } else if(a == this) return true; } return false; } var lucky = 7, more = [7, 11, 42]; lucky.isin(2, 3, 5, 8, more) //true
Możesz usunąć wymuszenie typu, zmieniając
==
na===
.źródło
Jeśli masz dostęp do podkreślenia, możesz użyć:
if (_.contains([1, 3, 12], foo)) { // ... }
contains
kiedyś pracowałeś w Lodash (przed V4), teraz musisz użyćincludes
if (_.includes([1, 3, 12], foo)) { handleYellowFruit(); }
źródło
To jest mała pomocnicza funkcja strzałki:
const letters = ['A', 'B', 'C', 'D']; function checkInList(arr, val) { return arr.some(arrVal => val === arrVal); } checkInList(letters, 'E'); // false checkInList(letters, 'A'); // true
Więcej informacji tutaj ...
źródło
const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].some(option => option === valToCheck); // false
includes
staje się lepszą opcją, jak w odpowiedzi @ alistera:const valToCheck = 'E'; const check = ['A', 'B', 'C', 'D'].includes(valToCheck); // false
Po prostu użyłem funkcji jQuery inArray i tablicy wartości, aby to osiągnąć:
myArr = ["A", "B", "C", "C-"]; var test = $.inArray("C", myArr) // returns index of 2 returns -1 if not in array if(test >= 0) // true
źródło
Dla potomnych możesz chcieć użyć wyrażeń regularnych jako alternatywy. Całkiem dobra obsługa przeglądarki (ref. Https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/match#Browser_compatibility )
Spróbuj tego
if (foo.toString().match(/^(1|3|12)$/)) { document.write('Regex me IN<br>'); } else { document.write('Regex me OUT<br>'); }
źródło