JavaScriptオブジェクトを通じてglobstarスタイルの**
検索をサポートするにはどうすればよいですか?オブジェクトにglob **を実装する方法は?
これは、照合対象にこれらの特殊な*
と**
のプロパティが含まれていて、正確に一致しない場合に一致するという点を除いて、lodashの_.get
のようなものです。以下のコード例で
、{ **: { middleName: 3 }}
ルールは、次のパスと一致する必要があり:
['middleName']
['clients', 'middleName']
['clients', '0', 'middleName']
**
ためマッチ0以上の要素なので、{**: { middleName: x }}
が本質的'middleName'
で終わる任意の配列と一致し、x
を返しています。単一レベル(正確に1つの要素の任意の値を有する)と一致も*
ルールがありますので
しかし、それは第二の経路ではなく、{ lastName: 2 }
と評価させ、**
よりも優先すべきです。
実際には、重複する「ルール」を書くべきではないので、あまり優先順位を気にしませんが、**
の実装方法を理解することはできません。
もっと実践的な例が必要な場合は、これを使用する予定です:1,2,3の数字はバリデータ関数に置き換えられ、 "パス"は<input>
の名前になります。このようにして、自分のフォームの検証ルールを指定できます。
また、私は葉ノードを返すことしか望んでいないので、それらのうちの1つが{ lastName: 2 }
を返すという事実は奇妙なものですが、私はそれほど心配していません。それが葉とノードのマッチだから**
がこれよりも優先されたとすれば、それはもっと良いと思います。
コード:
function glob(object, path, defaultValue) {
let [first, ...rest] = path;
let value = object[first];
if (value === undefined) {
value = object['*'];
if (value === undefined) {
// TODO: support **
return defaultValue;
}
}
if (rest.length) {
return glob(value, rest, defaultValue);
}
return value;
}
let rules = {
firstName: 1, // matches ['firstName']
clients: {
'*': {
lastName: 2, // matches ['clients', anything, 'lastName']
}
},
'**': {
middleName: 3, // matches [...anything, 'middleName']
}
}
console.log(glob(rules, ['firstName'])); // 1
console.log(glob(rules, ['clients', '0', 'lastName'])); // 2
console.log(glob(rules, ['clients', '0', 'middleName'])); // should be 3
console.log(glob(rules, ['clients', 'middleName'])); // should be { lastName: 2 } or 3, whatever's easier to implement
console.log(glob(rules, ['middleName'])); // should be 3
「JavaScriptオブジェクトを通じてglobstarスタイルの**検索をサポートするにはどうすればよいですか?」あなたは文字列(あなたは "パス"を参照してください)の配列を検索していませんか?問題文はあまり混乱しないかもしれません。 – spinkus
@spinkusええ、私はそれが少し混乱していることを知っています。私は配列/パスを通して検索していません - パスはオブジェクトのキーとして使用されます。オブジェクトにこれらの特別な '*'と '' ** 'キーを入れることができる点を除けば、これはlodashの[_.get](https://lodash.com/docs/4.17.2#get)のようなものです。 – mpen