実は一度文字列化任意のテキスト文字列とは異なり、JSONデータは、したがって、かなり定期的に構造化文字列を生成し、私たちは涼しい適用される場合がありますコードを2〜3のライナーに減らす正規表現。この1つまたは再帰的または反復的な方が効率的かどうかはわかりません。後で試してみるよ。
TL & DRコードはこれです。 F12はあなたの友人です。
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
// assuming that your json data is assigned to a variable jd
var js = JSON.stringify(jd),
sd = 1.3.toString(), //this input value should be supplied as string
rx1 = new RegExp('{"x":"([\\w-]+)[",:\\w]+(?=' + regExpEscape(sd) + ')',"g"),
rar = [],
result = [];
rar = rx1.exec(js); // < ["{"x":"child-3","y":"00000", "child-3"]
rar.length && result.push(rar[1]); // if rar is not empty save rar[1] to result
var rx2 = new RegExp('{"x":"([\\w-]+)(?=[":,\\.\\w-]+\\[{[\\[{}":,\\.\\w-]+' + regExpEscape(result[0]) + ')',"g");
while (!!(rar = rx2.exec(js))){result.push(rar[1])} // ["child-3", "Root-1", "child-2"]
一部を伝える物語:
をわずか2つのステップで、我々は後にある結果を得ることができます。
1.3が存在するかどうかをチェックしてxプロパティの値(name)を得るには、/{"x":"([\w-]+)[",:\w]+(?=1\.3)/g
regexpを使用できます。しかし、この正規表現を再利用可能にする方法を見つけよう。
// assuming that your search data is assigned to a variable sd
function regExpEscape(literal_string) {
return literal_string.replace(/[-[\]{}()*+!<=:?.\/\\^$|#\s,]/g, '\\$&');
}
var rx = '/{"x":"([\w-]+)[",:\w]+(?=' + regExpEscape(sd) + ')/g');
ここで、任意の検索データに対して正規表現を使用できます。私たちが残した場所から続けましょう...
// assuming that your json data is assigned to a variable jd
var js = JSON.stringify(jd),
sd = 1.3.toString(), //this input value should be supplied as string
rx1 = new RegExp('{"x":"([\\w-]+)[",:\\w]+(?=' + regExpEscape(sd) + ')',"g"),
rar = [],
result = [];
rar = rx1.exec(js); // < ["{"x":"child-3","y":"00000", "child-3"]
rar.length && result.push(rar[1]); // if rar is not empty save rar[1] to result
これまでのところとても良いです。私たちは、私たちが探していた結果を持つオブジェクトの名前を持っています。今の両親から同じ情報を取得するために、我々は、子の間にこれら二つの事実
- を使用し、それがどの
]
の文字があってはならない親です。
[
文字に達した場合、親要素に到達します。
クールで持ち運びができます。私はこれの上に頭脳の少しが溶けて来て、それを考え出しました/{"x":"([\w-]+)(?=[":,\.\w-]+\[{[\[{}":,\.\w-]+child-3)/g
まあまあそれはややわかりにくいですが、実際はかなりシンプルです。私を通過させてください。これは、xxx(yyy)の前に(?= [許可された文字]、それに続いて[いくつかの許可された文字]、その後に "子-3")続けなければなりません。子どもは誰でも、両親と兄弟だけです。我々は兄弟姉妹を望んでいない..それに応じて我々は\[{
それは私たちが親に到達し、兄弟をバイパスする方法です。私たちは欲しい鎖を持っています。
それを終了します。
var rx2 = new RegExp('{"x":"([\\w-]+)(?=[":,\\.\\w-]+\\[{[\\[{}":,\\.\\w-]+' + regExpEscape(result[0]) + ')',"g");
while (!!(rar = rx2.exec(js))){result.push(rar[1])}
これはそうです。 JSONオブジェクトの深さに関係なく、
古いと悪い質問:何を試してみましたか、私たちにいくつかのコードを教えてください – madalinivascu
希望の戻り値の例を追加してください。 –
簡単な方法:繰り返しながら各配列要素をJSON.stringifyし、用語をJSONにマッチさせます。 'r.filter(x => JSON.stringify(x).match(term))' – dandavis