2016-11-08 8 views
0

Object.keys ist nicht effizient, wenn Schlüssel Instanz RegExp

let ob = {}; 
 
ob[/\ing?$/] = `I match all strings end with "ing"`; //key is instance of 'RegEXp' 
 
ob["/\ing?$/"] = `I am sure it is not same as the above`; //key is instance of 'String' 
 

 
console.log(
 
`- Key RegExp : 
 
    ==> ${ob[/\ing?$/]} 
 
`); 
 

 
console.log(
 
`- Key String : 
 
    ==> ${ob["/\ing?$/"]} 
 
`);

Die obige Zeichenfolge zeigt, dass wörtliche Objekt-Eigenschaft eine Instanz RegExp Klasse sein kann, und es kann auch String natürlich sein, und sie sind ganz anders.

Meine Frage ist, wie Sie überprüfen, ob die Typ-Eigenschaft Object.keys oder Alternative verwendet. Bekannt unter Verwendung Object.keys, diese Methode wirft alle Schlüssel (Eigenschaften) zu string?

Object.keys(ob); 
//--> Expected :[/\ing?$/, "/\ing?$/"] 
//--> Actual : ["/\ing?$/", "/ing?$/"] 
+0

Sie können keine Objekte verwenden, Sie können das Array zum Speichern von Regex verwenden. – Tushar

+0

Objektschlüssel wird in Zeichenfolge konvertiert. –

+0

Was möchten Sie erreichen? – guest271314

Antwort

0

Die obige Zeichenfolge zeigt, dass wörtliche Objekt-Eigenschaft eine Instanz der Klasse RegExp sein kann

Das ist falsch. Alle Objektschlüssel sind string. Alles, was keine Zeichenkette ist, wird in Zeichenkette umgewandelt. Der Beweis kann im Codebeispiel unten gesehen werden. Obwohl o1 und o2 unterschiedlich sind, haben beide die gleiche Zeichenfolgendarstellung und können für den Zugriff auf die Eigenschaft o verwendet werden.

var o1 = {}; 
 
o1.toString = function(){return "I am unique";}; 
 

 
var o2 = {}; 
 
o2.toString = function(){return "I am unique";}; 
 

 

 
var o = {}; 
 
o[o1] = "foo"; 
 

 

 

 
console.log(o[o2]);

0

Die Eigenschaften werden in Zeichenketten umgewandelt, wenn sie gesetzt sind:

for (var key in ob) { 
    console.log('key', key, 'type', typeof key); 
} 

> key /\ing?$/ type string 
> key /ing?$/ type string 
2

Eigenschaftsnamen immer Strings sind. Wenn Sie versuchen, einen anderen Namen als Eigenschaftsnamen zu verwenden, wird dieser unter Verwendung von toString() in eine Zeichenfolge konvertiert. Also, wenn Sie tun:

ob[/\ing?$/] = `I match all strings end with "ing"`; //key is instance of 'RegEXp'; 

es als

ob[/\ing?$/.toString()] = `I match all strings end with "ing"`; //key is instance of 'RegEXp'; 

so behandelt ist der Schlüssel "/\ing?$/".

Wenn Sie das tun:

ob["/\ing?$/"] = `I am sure it is not same as the above`; //key is instance of 'String'; 

der Schlüssel ist die Zeichenfolge "/ing?$/". Der Backslash ist nicht mehr vorhanden, da in einem String-Literal der Backslash ein Escape-Zeichen ist. \i entkommt nur die i Zeichen, aber seit i hat keine besondere Bedeutung, es ist nur i.

Wenn Sie die gleichen Schlüssel wie von dem RegExp bekommen wollen, sollte es sein:

ob["/\\ing?$/"] = `I am sure it is not same as the above`; //key is instance of 'String'; 

Der doppelte Backslash den umgekehrten Schrägstrichs, so dass es buchstäblich in den String gesetzt wird.

let ob = {}; 
 
ob[/\ing?$/] = `I match all strings end with "ing"`; //key is instance of 'RegEXp'; 
 
ob["/\\ing?$/"] = `I am sure it is not same as the above`; //key is instance of 'String'; 
 
console.log(ob);

0

Die RegExp bei javascript in Frage entspricht nicht dem Beispiel String.

let re = /\ing?$/; 
 
console.log(re.test(`I match all strings end with "ing"`));

Sie können RegExp/(.|)ing?(\1|\.)$/ Zeichenfolge mit ing oder ing. oder "ing" Eigenschaft und einen Wert definieren Objekt als RegExp

const re = /(.|)ing?(\1|\.)$/; 
 

 
let ob = {[re]:re}; 
 

 
console.log(ob[re].test(`I match all strings end with "ing"`)); 
 

 
console.log(ob[re].test(`I match all strings end with ing.`)); 
 

 
console.log(ob[re].test(`I match all strings end with ing`)); 
 

 
console.log(Object.getOwnPropertyDescriptors(ob)); 
 

 
for (let {[re]:regexp} of [ob]) { 
 
    console.log(regexp instanceof RegExp); 
 
}

Endung entsprechen 0
0

Da ich der Besitzer Frage bin, die beste Lösung, die ich bemerkt, ist die Datenstruktur von wörtlichen Objekt Array zu ändern:

Von:

ob = { 
    /\ing?$/ : `I match all strings end with "ing"`, 
    "/\ing?$/" : `I am sure it is not same as the above` 
}; 

zu:

ob = [ 

    {key: /\ing?$/ , value: `I match all strings end with "ing"` }, 
    {key:"/\ing?$/" , value: `I am sure it is not same as the above` }, 
] 

Dadurch erhalten wir den Schlüsseltyp, wenn es RegExp Instanz ist.

Verwandte Themen