2013-09-03 7 views

答えて

11
は、リストを逆にして、 findを使用

_.find(list.reverse(), iterator); 

読むMDNをreverseのドキュメントのために。


残念ながら、アンダースコアのコレクションは配列またはオブジェクトのいずれかです。あなたのコレクションが配列の場合、あなたは運がいいです。 reverseを使用できます。

_.find(Object.keys(list).reverse(), function (key) { 
    return iterator(list[key], key, list); 
}); 

あなた自身のためfindLast関数を書くこともできます:それは、あなたの代わりにこれを実行する必要がありますオブジェクトの場合は

_.mixin({ 
    findLast: function (list, iterator, context) { 
     if (list instanceof Array) 
      return _.find(list.slice(0).reverse(), iterator, context); 
     else return _.find(Object.keys(list).reverse(), function (key) { 
      return iterator.call(context, list[key], key, list); 
     }); 
    } 
}); 

今、あなたは他のアンダースコア方式のようにfindLast使用することができます。

+0

ありがとうございました。 :)私はアンダースコアを望んでいた男.jsはバージョンを持っていた、彼らはすでに印象的なコレクションに合っているようだ...編集:これを発見、https://github.com/jashkenas/underscore/issues/546ダング。 –

+6

'Array.reverse'は元のリストを変更するので理想的ではありません。 – dule

+0

恐ろしい!ありがとう! – Lightning3

3

@AaditMShahで提案されているように、reverseを使用するのが最も簡単な解決策ですが、配列in placeを操作することに注意してください。要素の順序を保持する必要がある場合は、完了後にもう一度reverseに電話する必要があります。

あなたdon't want to use reverse、あなたは_.findLast

  • は、Lodashから該当するコードをつかむfindLastforEachRightの上に広げ、独自のfindLastを作る提供

    • 利用代わりLodashを、ことができます。

    これは、あなただけの配列を処理し、オブジェクトを気にしないならば、それはどのように見えるかです:。

    function findLast (array, callback, thisArg) { 
        var index = array.length, 
         last; 
    
        callback = callback && typeof thisArg == 'undefined' ? callback : _.bind(callback, thisArg); 
    
        while (index--) { 
         if (callback(array[index], index, array) == true) { 
          last = array[index]; 
          break; 
         } 
        } 
    
        return last; 
    } 
    

    (それは動作しますが、私はそれを適切にテストしていない読んで誰にもだから最初にいくつかのテストを行い、コードをコピーするだけではありません)。

  • +0

    ありがとうございました! –

    1

    アンダースコア1.8.0では、これを実現するための方法findLastIndexが導入されました。

    var numbers = [1, 2, 3, 4]; 
    var index = _.findLastIndex(numbers, isOddNumber); 
    if (index > 0) { console.log(numbers[index]); } 
    // returns 3 
    
    関連する問題