2017-06-22 3 views
0

Ich habe ein JavaScript-Objekt wie folgt aus:Vereinfachen Eltern-Kind-Ausdruck mit regex

{ 
    a : { 
     b : c, 
     d : e 
    } 
} 

In meinem Code, wenn b meine war mein Ausgangspunkt, konnte ich Eingabe der Zeichenfolge "this.$parent.d" die zu e bewerten würde.

Allerdings könnte ich auch die Zeichenfolge "this.$parent.b.$parent.d" eingeben, um das gleiche Ergebnis zu erhalten.

Meine Frage ist, wenn ich eine Zeichenfolge wie "this.$parent.b.$parent.d" gegeben werde, wie kann ich es auf die erste Weise vereinfachen?

Ich denke, was ich tun muss, ist Regex zu ersetzen alle Vorkommen von "$parent.<anything>.$parent" mit nur "$parent" und das sollte funktionieren, aber nicht sicher, wie dies genau zu tun.

+0

Ich bin verwirrt über Ihre Eltern/Kind-Beziehung. In der ersten Instanz ist 'this. $ Parent 'das enthaltene Objekt, mit dem Sie' .d' aufrufen können. Aber dann rufen Sie in der zweiten Instanz 'this. $ Parent.b' an, was bedeutet, dass' this. $ Parent' in 'a' aufgelöst wird? – mhodges

+0

Sorry editted jetzt den JSON – user2802557

+0

zu beheben Okay, das macht jetzt mehr Sinn. Sie wollen also 'this. $ Parent. [Not $ parent]. $ Parent. *' Einfach mit 'this. $ Parent. *' Sie wollen '. $ Parent verlassen.$ eltern', denn so kommst du auf die nächste Stufe in der Hierarchie – mhodges

Antwort

0

In der Tat, werden Sie einen noch kürzeren Ausdruck vereinfachen wollen:

.prop.$parent 

Ein solche Teilkette entfernt werden soll, da es sich um einen No-Betrieb.

Hier ist, wie Sie, dass mit einem regulären Ausdruck tun konnte:

function simplify(str) { 
 
    const expression = /\.(?!\$parent\.)[\w$]+\.\$parent(?=\.|$)/g; 
 
    while (str.length > (str = str.replace(expression, "")).length) {} 
 
    return str; 
 
} 
 

 
var strings = [ 
 
    "this.$parent.b.$parent.d",      // should be this.$parent.d 
 
    "this.$parent.b.$parent.d.$parent.b.$parent.b", // should be this.$parent.b 
 
    "this.$parent.b.$parent.$parent.b.$parent",  // should be this.$parent.$parent 
 
    "this.$parent.b.$parent.d.$parent.$parent.b", // should be this.$parent.$parent.b 
 
    "this.$parent.b.c.$parent.$parent.b",   // should be this.$parent.b 
 
    "this.$parentX.b.$parentX",      // should be this.$parentX.b.$parentX 
 
]; 
 

 
const results = strings.map(simplify); 
 
console.log(results);

0

ich denke, die regex Sie suchen das ist:

/\.\$parent\.[^$]?[^p]?[^a]?[^r]?[^e]?[^n]?[^t]?\.\$parent/g

Jemand, der besser auf regex ist als ich hoffentlich vereinfachen kann, da es sehr ausführlich scheint.

Die folgende Lösung verwendet eine rekursive Funktion, denn wenn zwei Instanzen in derselben Zeichenfolge ersetzt werden, haben Sie jetzt eine weitere Instanz von .$parent.*.$parent erstellt, die dann nur durch .$parent ersetzt werden muss.

Zum Beispiel:

this.$parent.b.$parent.d.$parent.$parent.b

Nach 1 .replace() ->this.$parent.d.$parent.$parent.b

Nach 2 .replace() ->this.$parent.$parent.b

Hier ist der Code in Aktion:

var expression = /\.\$parent\.[^$]?[^p]?[^a]?[^r]?[^e]?[^n]?[^t]?\.\$parent/g; 
 

 
var strings = [ 
 
    "this.$parent.b.$parent.d",      // should be this.$parent.d 
 
    "this.$parent.b.$parent.d.$parent.b.$parent.b", // should be this.$parent.b 
 
    "this.$parent.b.$parent.$parent.b.$parent",  // should be this.$parent.$parent 
 
    "this.$parent.b.$parent.d.$parent.$parent.b" // should be this.$parent.$parent.b 
 
]; 
 

 
function simplify (str) { 
 
    var str = str.replace(expression, ".$parent"); 
 
    if (expression.test(str)) { 
 
     return simplify(str); 
 
    } 
 
    return str; 
 
} 
 

 
strings.forEach(function (str) { 
 
    console.log(simplify(str)); 
 
});