1

この関数の優雅さを改善する方法があるかどうか疑問に思っています:

  function findById(id) {
    var items = [
      { Id: 1, Value: 'My value 1' },
      { Id: 2, Value: 'My value 2' }
     ];

    var result = $.grep(items, function (obj) { return obj.Id === id; });

    return result.length > 0 ? result[0] : null;
  }

特に、私はむしろ次のように見えることを望みます:

  function findById(id) {
    var items = [
      { Id: 1, Value: 'My value 1' },
      { Id: 2, Value: 'My value 2' }
     ];

    return $.grep(items, function (obj) { return obj.Id === id; })[0] || null;
  }

これは明らかに失敗の山です。しかし、アイデアとしては、おそらく関数をよりクリーンに記述する方法があるということです。大したことではありませんが、何か不足している場合に備えてこれを書き留めておこうと思いました。

[編集] ご指摘のとおり、理想的なコードは問題なく動作します。空の配列の最初の要素にアクセスするとエラーがスローされると誤って想定していましたが、代わりに undefined が返されます。皆さんありがとう!

4

1 に答える 1

2

あなたの「理想的な」コードは正常に動作します。C# では、この機能は と呼ばれFirstOrDefaultます。

これは現在 JavaScript (または jQuery afaik) に組み込まれていませんが、次のバージョンで追加される可能性があります。

私たちの良き友人である Florian は、 と呼ばれる希望する構文を使用できるようにする小さな関数を書きましたor

ここにあります:

function or(arr, callback, context) {
    var el;
    for (var i = 0, l = arr.length; i < l; i++) {
        el = arr[i];
        if (callback.call(context, el, i, arr)) {
            return el;
        }
    }
    return null;//to return null and not undefined
}

例:

or([1,2,3],function(elem){ return i>2;}); //returns 3;
or([1,2,3],function(elem){ return i>3;}); //returns null;
or([1,2,3],function(elem){ return i>1;}); //returns 2;

あなたの例では、それは

return or(items, function (obj) { return obj.Id === id; });

利点は、配列の途中で一致が見つかった場合、配列全体を反復処理しないことです。配列が大きい場合、それは大きな違いです。

于 2013-03-18T16:04:58.743 に答える