Ich habe gerade einen sehr subtilen Fehler in meinem Code für die Validierungsbibliothek des Quartetts gefunden und möchte ihn teilen.
Aufgabe
Gegeben eine Liste von Zeichenfolgen: VALID_STRINGS.
Erstellen Sie eine Validierungsfunktion test(x)
, die zurückgegeben werden soll, true
wenn x
es sich um eine der Zeichenfolgen in diesem Array handelt.
Geltungsbereich: x
- Beliebiger Javascript-Wert
Einschränkungen: Verwenden Sie ES6 nicht. (Ziel - alter Browser)
Lösung 1: Eine direkte Entscheidung
Die einfachste Lösung besteht darin, alle Zeilen in diesem Array durchzugehen und zu vergleichen.
const VALID_STRINGS = [/* VALID STRINGS */]
function test1(x) {
for (let i = 0; i < VALID_STRINGS.length; i++) {
if (VALID_STRINGS[i] === x) return true
}
return false
}
, , . O( VALID_STRINGS)
, (indexOf, includes, some, reduce ...). , .
№2:
, .
. . .
const VALID_STRINGS = [/* VALID STRINGS */]
const VALID_STRINGS_DICT = {}
for (let i = 0; i < VALID_STRINGS.length; i++) {
const validString = VALID_STRINGS[i]
VALID_STRINGS_DICT[validString ] = true
}
function test2(x) {
return VALID_STRINGS_DICT[x] === true
}
!
! !
, . , — VALID_STRINGS. :
//
const VALID_STRINGS = ['somestring', 'anotherstring']
// ,
const VALID_STRINGS_DICT = { somestring: true, anotherstring: true }
const underwaterRock = ['somestring']
test2(underwaterRock) // true
underwaterRock
— true
. , test2(x)
x
.
VALID_STRINGS_DICT[x]
— x . — . — .
['somestring'].toString() === 'somestring'
№3:
x
const VALID_STRINGS = [/* VALID STRINGS */]
const VALID_STRINGS_DICT = {}
for (let i = 0; i < VALID_STRINGS.length; i++) {
const validString = VALID_STRINGS[i]
VALID_STRINGS_DICT[string] = true
}
function test2(x) {
return typeof x === 'string' && VALID_STRINGS_DICT[x] === true
}
, .
№4: Set
ES6. .
const VALID_STRINGS = [/* VALID STRINGS */]
const validStringsSet = new Set(VALID_STRINGS)
function test4(x) { return validStringsSet.has(x) }
, , .