web-dev-qa-db-ja.com

Lodash get vs. es6フォールバック値?

Lodashは新しいES6オプション引数を使用する場合とどのように違いますか?

私は次のコードを持っています:

location: {
  latitude: response.pickupLocation.latitude || "",
  longitude: response.pickupLocation.longitude || ""
},

Lodashを使用すると、実行できることがわかります。

latitude: get(response, 'pickupLocation.latitude', '')

または、オブジェクトとパスを取り込んで常にデフォルトのフォールバックとして''を返す関数を作成することもできます。コードが短くなるという事実以外に、ここでLodashを使用する利点はありますか?

11
abrarisme

_.get の利点は、必要なプロパティが存在するかどうかの継続的なチェックを省略できることです。

latitude: response && response.pickupLocation && response.pickupLocation.latitude || "",
17
Nina Scholz

これはES6とは関係がなく、単なる論理的なOR演算子です。「オプションの引数」は デフォルトパラメータ に関連しているように聞こえますが、これらはfunctionで使用されます署名。

個人的には、外部ライブラリを必要としないので、論理的なORを使用します。また、リファクタリング、使用法の検索が複雑になるため、オブジェクトプロパティにアクセスするときに文字列を使用しないことをお勧めします。 TypeScriptのオプションの使用で、コードの完了を妨げます。

Null型のプロパティにアクセスしても例外が発生しないことを確認したい場合は、説明されているアプローチ here を使用できます。

getSafe(() => response.pickupLocation.latitude) || ''
6
str

@strの回答を参照すると、responsepickupLocationプロパティがない場合、ORに関係なく、TypeError(未定義のプロパティ緯度を読み取れません)になります。オペレーター。

これをtry-catchでラップできます。次に、tryでresponse.pickupLocation.latitude || fallbackを返すか、catchブロックでfallbackを返します。

これは、誤って定義された値を処理しません(response.pickupLocation.latitude0であると想定してください)。この関数は、0ではなくfallback値を返します。これはtypeof(typeof response.pickupLocation.latitude !== 'undefined' ? response.pickupLocation.latitude : fallback)をチェックすることで簡単に処理できますが、ハードコーディングされたオブジェクトパスについてはまだ話し合っています。同じ問題が承認された回答にも表示されます。

これを任意のオブジェクトパスに対して動的に処理するには、提供されたオブジェクトをループし、hasOwnPropertyを確認し、指定されたパスの終わりに到達するまで、反復ごとにネストされたプロパティをはがします。このようなもの:

const getSafe = (object, path, fallback) => {
    const fragments = path.split('.')
    let value

    for (let i = 0; i < fragments.length; i++) {
        if (!obj.hasOwnProperty(fragments[i])) {
            return fallback;
        }
        value = object[fragments[i]];
    }

    return value;
}
0
Van G