ロダッシュとアンダースコアの違い[終了]


1602

なぜ誰かがlodash.jsまたはunderscore.jsを好むのでしょうかユーティリティライブラリを他?

ロダッシュはアンダースコアのドロップイン代替品のようですが、アンダースコアはより長く使用されていました。

どちらもすばらしいと思いますが、それらがどのように機能するかについて十分に理解していないため、知識のある比較を行うことができません。違いについてもっと知りたいのですが。


2
githubページにリンクされているlodashに関するスクリーンキャストのいくつかを見てみたいかもしれません。個人的に私はunderscore.jsを使用してきましたが、それは私が最初に使用したものであり、あなたが言うようにそれがより長い間使用されているためです。
Jack

26
lodashそして現在マージスレッドのunderscore下にあります
zangw

回答:


2023

Lo-Dashを作成して、配列、文​​字列、オブジェクト、およびargumentsオブジェクト1に対して、より一貫したクロス環境反復のサポートを提供しました。以降、アンダースコアのスーパーセットになり、より一貫したAPI動作、より多くの機能(AMDサポート、ディープクローン、ディープマージなど)、より詳細なドキュメントとユニットテスト(Node、Ringo、Rhino、Narwhal、PhantomJSで実行されるテスト)を提供します、およびブラウザー)、大規模な配列/オブジェクトの反復処理のための全体的なパフォーマンスと最適化の向上、およびカスタムビルドによる柔軟性の向上とテンプレートの事前コンパイルユーティリティによる。

Lo-DashはUnderscoreよりも頻繁に更新れるため、Underscoreの最新の安定バージョンとの互換性を確保するためのlodash underscoreビルドが提供されます。

ある時点で、私はアンダースコアへのプッシュアクセスさえ与えられました。これは、一部にはLo-Dashが30以上の問題を提起する責任があるためです。着陸のバグ修正、新機能、およびUnderscore v1.4.x +のパフォーマンス向上。

さらに、デフォルトでLo-Dashを含む少なくとも3つのBackboneボイラープレートがあり、Lo-DashがBackboneの公式ドキュメントで言及されています

Lo-DashとUnderscoreの違いの詳細については、キットケンブ​​リッジの投稿「Say "Hello" to Lo-Dash」を参照してください。

脚注:

  1. アンダースコアの配列、文字列、オブジェクト、およびargumentsオブジェクトのサポートに一貫性がありません。新しいブラウザでは、アンダースコアメソッドは配列の穴を無視、「オブジェクト」メソッドはargumentsオブジェクトを反復し、文字列は配列のように扱われ、メソッド(「プロトタイプ」プロパティを無視)とオブジェクト(「toString」のようなシャドウされたプロパティを反復し、 "valueOf")ですが、古いブラウザではそうではありません。また、アンダースコアの方法_.cloneは配列のホールを保持するようなもの_.flattenですが、そうでないものもあります。

174
@ブライアン-Lo-Dashを開発している間、私は「Los-Dashでは、アンダースコアと比較してネガティブとして誰かが何を指摘できるだろうか」という質問を続けてきました。そしてそれらに対処します。これが、ドキュメントを強化し、カスタムビルドを追加し、ソースを読みやすくした理由です。
John-David Dalton

10
いくつかのベンチマークを投稿したくなりますが、それは退屈な作業になる可能性があります。すべてのベンチマーク私がきた実行が高速化(するLO-ダッシュを証明していることを言えば十分MUCH速く多くの場合)、アンダースコアより。
Wil Moore III、

186
私はlo-dashが大好きで、それを使用しているので、バッシングしているとは思わないでください。しかし、新しいライブラリを作成するのではなく、アンダースコアに貢献してみませんか?
Xananax 2013

133
@Xananax-コメントスレッドを確認してください:github.com/jashkenas/underscore/commit/…-これでその質問に答えることができます。
Rob Grant

41
lodashをアンダースコアに戻す努力はありましたか?
街灯

186

Lo-Dashはアンダースコアから着想を得ていますが、現在では優れたソリューションです。あなたは作ることができますカスタムビルド持って、より高い性能を、AMDをサポートしてい偉大な余分な機能を。このチェック下線ベンチマーク対LO-ダッシュを ...このjsperf上とLO-ダッシュについての素晴らしい記事を

コレクションを操作するときに最も便利な機能の1つは、省略構文です。

var characters = [
  { 'name': 'barney', 'age': 36, 'blocked': false },
  { 'name': 'fred',   'age': 40, 'blocked': true }
];

// using "_.filter" callback shorthand
_.filter(characters, { 'age': 36 });

// using underscore
_.filter(characters, function(character) { return character.age === 36; } );

// → [{ 'name': 'barney', 'age': 36, 'blocked': false }]

lodash docsから取得


1
キットケンブ​​リッジのブログへのリンクは非常に有益です。
ブライアンM.ハント

これは間違っていると思います(pluckの例)。最後のアップデート1.8.3以降、lodashと同じ方法でpluckを使用できます。とにかく、以前のバージョンでは、アンダースコアがマップと同じ関数を公開することはないと思います(アンダースコアの例はマップ関数のようです)
alexserver

7
filter2012 github.com/jashkenas/underscore/issues/648(その名前はwhere)からのアンダースコアの機能
Muhammad Hewedy

Lo-Dash vs Underscoreベンチマークリンクでエラー500が発生する
Hylle

86

私のように、アンダースコアとロダッシュの使用法の違いのリストを期待していた場合は、アンダースコアからロダッシュに移行するためガイドがあります。

後世のための現在の状態は次のとおりです。

  • アンダースコア_.anyはロダッシュです_.some
  • アンダースコア_.allはロダッシュです_.every
  • アンダースコア_.composeはロダッシュです_.flowRight
  • アンダースコア_.containsはロダッシュです_.includes
  • アンダースコア_.eachは戻ることによる終了を許可しませんfalse
  • アンダースコア_.findWhereはロダッシュです_.find
  • _.flattenロダッシュが浅い間、アンダースコアはデフォルトで深いです
  • アンダースコア_.groupByは、パラメーターが渡される反復子をサポートしますが(value, index, originalArray)、Lodashでは、反復子に_.groupBy渡されるパラメーターは1つだけです(value)
  • アンダースコア_.indexOf3番目のパラメータではundefinedLodashです_.indexOf
  • アンダースコア_.indexOf3番目のパラメータではtrueLodashです_.sortedIndexOf
  • アンダースコア_.indexByはロダッシュです_.keyBy
  • アンダースコア_.invokeはロダッシュです_.invokeMap
  • アンダースコア_.mapObjectはロダッシュです_.mapValues
  • アンダースコア_.maxはロダッシュ_.max_.maxBy
  • アンダースコア_.minはロダッシュ_.min_.minBy
  • アンダースコア_.sampleはロダッシュ_.sample_.sampleSize
  • アンダースコア_.objectはロダッシュ_.fromPairs_.zipObject
  • _.omit述語によるアンダースコアはロダッシュです_.omitBy
  • アンダースコア_.pairsはロダッシュです_.toPairs
  • _.pick述語によるアンダースコアはロダッシュです_.pickBy
  • アンダースコア_.pluckはロダッシュです_.map
  • アンダースコア_.sortedIndexはロダッシュ_.sortedIndex_.sortedIndexOf
  • アンダースコア_.uniqによってiterateeあるLodash_.uniqBy
  • アンダースコア_.whereはロダッシュです_.filter
  • アンダースコア_.isFiniteが一致しないNumber.isFinite
    (例:アンダースコアで_.isFinite('1')戻りますtruefalse、Lodashでは戻ります)
  • アンダースコアの_.matches省略表現は、深い比較をサポートしていません
    (例_.filter(objects, { 'a': { 'b': 'c' } })
  • アンダースコア≥1.7&Lodash _.template構文は
    _.template(string, option)(data)
  • Lodash _.memoizeキャッシュはMapオブジェクトのようなものです
  • Lodashはcontext多くのメソッドの引数をサポートしていません_.bind
  • Lodashは暗黙の連鎖遅延連鎖、およびショートカット融合をサポートします
  • Lodashは、オーバーロードを分割し_.head_.last_.rest、&_.initialに出て
    _.take_.takeRight_.drop、& _.dropRight
    (すなわち_.head(array, 2)アンダースコアではある_.take(array, 2)Lodashで)

1
移行するときに自分でこれらの問題に遭遇し、(WIP)クロスドキュメントを維持しています。他の人にも役立つことを願っています!
luxon 2016

60

Johnの回答に加えて、lodash(これまではアンダースコアの "私"と見なしていた)について読み、パフォーマンステストを確認し、ソースコードを読み、ブログの投稿を読み、lodashを構成するいくつかのポイントアンダースコアよりもはるかに優れているのは次のとおりです。

  1. それは速度の問題ではなく、速度の一貫性(?)

    アンダースコアのソースコードを見ると、最初の数行で、多くの関数のネイティブ実装でのアンダースコアのフォールバックがわかります。理想的な世界では、これはより良いアプローチでしたが、これらのスライドに示されているパフォーマンスリンクの一部を見ると、これらの「ネイティブ実装」の品質がブラウザによって大きく異なるという結論を導くのは難しくありません。ブラウザへ。Firefoxは、一部の機能では非常に高速で、一部のChromeでは支配的です。(IEも支配するいくつかのシナリオがあると思います)。私は、ブラウザー間でパフォーマンスがより一貫しているコードを好む方が良いと思います。

    以前にブログの投稿を読んでください。それを信じるためではなく、ベンチマークを実行して判断してください。Chromeのようなシンプルネイティブな関数でさえ、アンダースコアよりも100〜150%高速にロダッシュが実行されるのを見ていると、私は今驚かさArray.everyれます!

  2. lodash の追加も非常に便利です。

  3. アンダースコアのコードへの貢献を示唆Xananaxの高度upvotedコメントについて:それは持っているのが無難でGOOD競争を、それが行く革新を続けるが、また良い形で自分自身(またはライブラリ)を維持するためにあなたを駆動するだけではありません。

lodash の違いのリストを以下に示します。アンダースコアビルドは、アンダースコアプロジェクトのドロップイン置換です。


6
「速度の一貫性」はどの場合に価値がありますか?たとえば、FFとIEで100%の速度を持つメソッドがあり、ネイティブ実装ではIEで80%、FFで120%の速度(またはその逆)になります。次に、FFのネイティブ実装とIEの独自の実装を使用することをお勧めします。IEと同じ速度にするために、FFの速度を落としてみましょう。コードのサイズと保守性、またはすべてのブラウザーの平均的な速度低下が問題になりますが、速度の一貫性はどうでしょうか。
stofl 2013年

2
「一貫してより速い速度」を意味しました
クマーハーシュ2013年

1
サイズの違いはどうですか?下線とまったく同じ機能を持つlodashを使用してカスタムビルドを作成するとしますか?それらの間に大きな違いはありますか?再実装するとサイトが重くなると思います。
F Lekschas 2013

5
ブラウザのネイティブ実装にフォールバックする傾向があります。これは、ほとんどの場合、許容できるパフォーマンスがあり、ライブラリを最新に保つことを心配せずにブラウザの更新で改善できるためです。
orad 14

3
@KumarHarshたぶん私はそれをうまく表現しなかった。常に独自の実装を優先するのではなく、可能な場合はネイティブ関数を内部で使用するライブラリを使用する傾向があることを意味しました。
orad 14

42

これは2014年で、数年では遅すぎます。それでも私は私の主張が保持すると思います:

私見この議論はかなり比例して吹き飛ばされました。前述のブログ投稿を引用:

Underscore、Valentine、wuなどのほとんどのJavaScriptユーティリティライブラリは、「ネイティブファーストデュアルアプローチ」に依存しています。このアプローチはネイティブ実装を優先し、同等のネイティブがサポートされていない場合にのみバニラJavaScriptにフォールバックします。しかし、jsPerfは興味深い傾向を明らかにしました。配列または配列のようなコレクションを反復処理する最も効率的な方法は、ネイティブ実装を完全に回避し、代わりに単純なループを選択することです。

「単純なループ」と「バニラJavascript」は、配列またはオブジェクトメソッドの実装よりもネイティブであるかのようです。ねえ…

確かに単一の真実の情報源があればいいのですが、そうではありません。あなたが他のことを言われたとしても、私の愛するバニラ神は存在しません。申し訳ありません。本当に当てはまる唯一の前提は、すべての主要なブラウザーで良好に機能することを目的としたJavascriptコードを作成し、それらすべてに同じものの異なる実装があることを知っていることです。それは、穏やかに言えば、対処する雌犬です。しかし、それが好きかどうかにかかわらず、それが前提です。

たぶん、みんながツイッターのようなパフォーマンスを必要とする大規模なプロジェクトに取り組んでいるので、現在、1秒あたりのリストの850,000(アンダースコア)と2,500,000(ロダッシュ)の反復の違いが実際にわかります。

私は一人ではありません。つまり、パフォーマンスの問題に対処しなければならないプロジェクトで作業しましたが、アンダースコアやLo-Dashによって解決または発生することはありませんでした。そして、実装とパフォーマンスの真の違い(現在C ++について話している)を取得できない限り、反復可能オブジェクト(オブジェクトまたは配列、スパースであるかどうかにかかわらず)のループを言うことができれば、私はむしろ気になりませんすでに意見が分かれているベンチマークプラットフォームの結果に基づいた主張

Rhinoは、1つの「中世ループメソッドがより優れて永遠に実行されず、何もない」という司祭が、すべてのFFの突然の配列メソッドは、彼/彼女の独断的なブレインファックよりもはるかに高速です。ランタイム環境をだますことによって、ランタイム環境をだますことはできません。促進するときにそれについて考えてください...

あなたのユーティリティベルト

... 次回。

それを適切に保つには:

  • ネイティブishを犠牲にすることなく便利な場合は、アンダースコアを使用してください。
  • Lo-Dashは、便利で拡張機能カタログ(ディープコピーなど)が好きで、インスタントパフォーマンスがどうしても必要で、ネイティブAPIがリリースされたらすぐに代替手段を用意してもかまわない場合に使用します。意欲的な回避策。これはすぐに起こります。限目。
  • 3つ目の解決策もあります。DIY!環境を把握します。不整合について知る。彼らの(John-DavidJeremy)コードを読んでください。一貫性/互換性レイヤーが本当に必要であり、ワークフローを強化したり、アプリのパフォーマンスを向上させたりする理由を説明できない場合は、これを使用しないでください。自分で完全に記述できる単純なポリフィルで要件が満たされている可能性は非常に高いです。どちらのライブラリも、ほんの少し砂糖が入った単なるバニラです。彼らはどちらも、最も甘いパイを提供している人をめぐって戦います。しかし、私を信じてください、結局どちらも水で調理しているだけです。バニラの神はいないので、バニラの法王はいないはずですよね?

ニーズに最も適合するアプローチを選択してください。いつものように。私は、いつのまにかランタイムチートよりも実際の実装にフォールバックすることを望みますが、それは今日の好みの問題のようです。http://developer.mozilla.comhttp://caniuse.comのような高品質のリソースに固執すれば、大丈夫です。


ルーカスを投稿していただきありがとうございます。ビルトインをさらに最適化できますか?ライブラリに匹敵する最適化を妨げるような標準によって課せられた制約があるので収集しましたが、詳細がわからないのか、それが本当であるか、本当のままかはわかりません。
ブライアンM.ハント

例「99%のユースケースに合わせて最適化することで、fast.jsメソッドは、ネイティブの同等のメソッドよりも最大5倍高速になる可能性があります。」– github.com/codemix/fast.js
Brian M. Hunt

1
こんにちはブライアンです。これが誤解を招くのは残念ですが、これらのライブラリがネイティブの同等のライブラリよりも高速ではないと言ったわけではありません。現在、パフォーマンスの切実な必要性がある場合は、LoDashやfast.jsなどのツールキットを使用すると、標準メソッドの実装が高速になるため、おそらく良いでしょう。しかし、ネイティブメソッドに頼らないライブラリを使用することを選択した場合、組み込みの将来のパフォーマンス最適化を見逃す可能性があります。ブラウザは最終的に進化します。
LukasBünger14年

4
ブラウザーの「製造元」は、ブラウザーの標準に準拠し続けると、パフォーマンスが大幅に低下します。ネイティブ実装でのほとんどのパフォーマンス向上は、より高速なハードウェアの結果です。「ネイティブ実装は追いつく」言い訳は何年も前からありました。年=インターネット上の永遠。IFネイティブ実装はこれまでに追いつく、ライブラリはそれらを使用するように更新されます。それがオープンソースのいいところです。アプリ開発者が最新のライブラリに更新しない場合、アプリが急に遅くなることはなく、高速化されません。
Andrew Steitz 2014年

2
...しかし、あなたが彼らに彼らに尋ねたならば、Array.from彼らはおそらくそれが何をすべきかさえ知らないでしょう。JSの「ユーティリティベルト」の人々は、非常に一般的な回避策の宣伝にあまりにも関心を寄せているようで、そうすることで忘れてしまう傾向があり、実際には標準化プロセスが薄められています。機能の必要がないため、ブラウザの「製造元」に圧力がかかりません。楽しい事実:4の主要なブラウザの2は、オープンソース・プロジェクト(に基づいている12)。
LukasBünger2014

20

ここで述べたことのほとんどに同意しますが、underscore.jsを支持する議論、つまりライブラリーのサイズを指摘したいだけです。

特にモバイルデバイスで主に使用する予定のアプリまたはWebサイトを開発している場合は、結果のバンドルのサイズと、起動時間またはダウンロード時間への影響が重要な役割を果たす可能性があります。

比較のために、これらのサイズは、ionic serveを実行した後にsource-map-explorerで気付いたサイズです。

lodash: 523kB
underscore.js: 51.6kb

2020年2月に編集:

BundlePhobiaを使用して、ローダッシュアンダースコアの現在のサイズを確認できます


1
ピーターに感謝します、これはここで注意する価値のあるポイントです。gist.github.com/alekseykulikov/5f4a6ca69e7b4ebed726を含む、他の場所でより多くの議論があります。(この回答は、他のいくつかの議論をリンクし、関連するビットを引用することで改善される可能性があります)サイズの違いは、lodashのサブセクションとtree-shaking lodashを選択することで減らすことができます。🕷–
ブライアンM.ハント

Thx @ BrianM.Huntの返信で、lodashのサブセクションを含めることが可能であることを知りませんでした。最近、Ionic-nativeを使用して、Ionicはネイティブライブラリにもこのような方法を採用しました。アプリのサイズについて懸念が
高まって

1
どこで523kBを手に入れたのかしら?lodash.comによると、圧縮されたのは24kBだけです。ダウンロードは74kBのみ
Martian2049

1
私は私のコメントで言ったように私のポストは、4月2017年に作られたsource-map-explorer after running ionic serve
デヴィッド・ダルBUSCO

5
2018年3月-lodash.min.jsは72.5 kB、underscore-min.jsは16.4 kB
結合

10

それがOPの意味するものかどうかはわかりませんが、アンダースコアからロダッシュに移行するときに留意する必要がある問題のリストを探していたため、この質問に遭遇しました。

誰かがそのような違いの完全なリストを載せた記事を投稿していただければ本当にありがたいです。難しい方法で学んだこと(つまり、コードが本番環境で爆発する原因となったもの:/)から始めましょう。

  • _.flattenアンダースコアはデフォルトで深いので、浅くするには2番目の引数としてtrueを渡す必要があります。lodashでは、デフォルトで浅く、2番目の引数がそれを深くするのでtrueを渡す!:)
  • _.lastアンダースコアでは、必要な要素の数を示す2番目の引数を受け入れます。そのlodashようなオプションはありません。あなたはこれをエミュレートすることができます.slice
  • _.first (同じ問題)
  • _.templateアンダースコアはさまざまな方法で使用できます。その1つはテンプレート文字列とデータを提供し、それを取得するHTMLことです(または、少なくともそれが少し前に機能した方法です)。ではlodashもしあなたが、その後データを養う必要がある機能を受け取ります。
  • _(something).map(foo)アンダースコアで動作しますが、lodashではそれをに書き換える必要がありました_.map(something,foo)。多分それはただのTypeScript問題でした

4
lodashでは、チェーニングは遅延イテレータを渡し、のようなエンドポイントを必要とします_(something).map(foo).value()
ブライアンM.ハント

これらのライブラリへの呼び出しをプロキシするバックボーンコレクションを使用している場合、これはすべてを打つ可能性があります。たとえば、collection.first(5)は最初の5つの要素ではなく、最初の要素を提供します:)
qbolec

8

http://benmccormick.org/2014/11/12/underscore-vs-lodash/

ベンマコーミックによる2つを比較する最新の記事:

  1. Lo-DashのAPIはUnderscoreのスーパーセットです。

  2. 内部で[Lo-Dash]が完全に書き直されました。

  3. Lo-DashはUnderscoreよりも遅くはありません。

  4. Lo-Dashには何が追加されていますか?

    • 操作性の向上
    • 追加機能
    • パフォーマンスの向上
    • 連鎖の省略構文
    • 必要なものだけを使用するカスタムビルド
    • セマンティックバージョニングと100%コードカバレッジ

6

私にとって重要な違いが1つ見つかりました。下線と互換性の_.extend()ないバージョンのlodash は、クラスレベルで定義されたプロパティまたはメソッドをコピーしませ

これを実証するJasmineテストをCoffeeScriptで作成しました。

https://gist.github.com/softcraft-development/1c3964402b099893bd61

幸い、lodash.underscore.jsすべてをコピーするというUnderscoreの動作が維持されます。これは、私の状況では望ましい動作でした。


4

lodash_.mapValues()、アンダースコアと同じです_.mapObject()


0

ほとんどの場合、アンダースコアはlodashのサブセットです。時々、現在アンダースコアのように、lodashがmapObjectのように持っていないかっこいい小さな関数があるでしょう。これにより、プロジェクトの開発に多くの時間を節約できました。


現時点では、_。mapValues
crapthings

@crapthings-この投稿の時点で、私はmayValuesとmapKeysを知っていましたが、それらはmapObjectとは異なります。たぶん一方を他方に適用する場合がありますが、mapObjectはそれ自体が関数です。
rashadb 16

0

彼らはロダッシュとかなり似ていますが引き継いでいます...

どちらも、JavaScriptのユーティリティの世界を取り入れたユーティリティライブラリです...

思わLodashは今より定期的に更新するので、より最新のプロジェクトに慣れています...

また、Lodashは数KBだけ軽量化されているようです...

どちらもapiとdocは優れていますが、Lodashだと思います方が良い ...

これは、配列の最初の値を取得するための各ドキュメントのスクリーンショットです...

下線:

下線

ロダッシュ: ロダッシュ

状況は随時更新される可能性があるため、ウェブサイトも確認してください...

ロダッシュ

下線

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.