Node.jsでのUnderscoreモジュールの使用


147

私はnode.jsとモジュールについて学習してきましたが、Underscoreライブラリを適切に動作させることができないようです... Underscoreから関数を初めて使用すると、_オブジェクトが次の結果で上書きされるようです私の関数呼び出し。誰が何が起こっているのか知っていますか?たとえば、以下はnode.js REPLからのセッションです。

Admin-MacBook-Pro:test admin$ node
> require("./underscore-min")
{ [Function]
  _: [Circular],
  VERSION: '1.1.4',
  forEach: [Function],
  each: [Function],
  map: [Function],
  inject: [Function],
  (...more functions...)
  templateSettings: { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g },
  template: [Function] }
> _.max([1,2,3])
3
> _.max([4,5,6])
TypeError: Object 3 has no method 'max'
    at [object Context]:1:3
    at Interface.<anonymous> (repl.js:171:22)
    at Interface.emit (events.js:64:17)
    at Interface._onLine (readline.js:153:10)
    at Interface._line (readline.js:408:8)
    at Interface._ttyWrite (readline.js:585:14)
    at ReadStream.<anonymous> (readline.js:73:12)
    at ReadStream.emit (events.js:81:20)
    at ReadStream._emitKey (tty_posix.js:307:10)
    at ReadStream.onData (tty_posix.js:70:12)
> _
3

自分でJavascriptファイルを作成してインポートすると、正常に動作しているようです。Underscoreライブラリには何か特別なものがあるのでしょうか?

回答:


169

Node REPLは、アンダースコア変数を使用して最後の操作の結果を保持するため、アンダースコアライブラリによる同じ変数の使用と競合します。次のようなものを試してください:

Admin-MacBook-Pro:test admin$ node
> _und = require("./underscore-min")
{ [Function]
  _: [Circular],
  VERSION: '1.1.4',
  forEach: [Function],
  each: [Function],
  map: [Function],
  inject: [Function],
  (...more functions...)
  templateSettings: { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g },
  template: [Function] }
> _und.max([1,2,3])
3
> _und.max([4,5,6])
6

2
ありがとうございました。それは簡単でした。
Geoff

6
おかげで、頭をキーボードに30分間ぶつけてきました。ありがとうございます。
rossipedia 2013年

3
これが、SOがすばらしい理由です。このような素晴らしい答えは、「頭を叩く」時間を節約します。ありがとう、@ Mike
Brian Tracy、

ノードv6 _、REPLでのへの割り当てをサポートしています。
John-David Dalton

194

今日(2012年4月30日)から、Node.jsコードで通常どおりアンダースコアを使用できます。以前のコメントは、REPLインターフェイス(ノードのコマンドラインモード)が「_」を使用して最後の結果を保持することを正しく指摘していますが、コードファイルで自由に使用でき、標準を実行することで問題なく機能します。

var _ = require('underscore');

幸せなコーディング!


7
下線をグローバル化しようとすると、これは機能しません。gist.github.com
Lance Pollard

9
誰かがかつて、グローバルはすべての開発言語に悪いと私に言った。それを必要とするモジュールでvar _ = require( 'underscore')を指定する必要があるという問題はありません。nodejs.org/api/modules.html#modules_caching
Erick Ruiz de Chavez

2012年4月30日はどのノードバージョンに対応しますか?
ポーズID

2012年4月は0.6に対応します。
エリックRuiz de Chavez

エリック、サーバー側でもクライアント側のコードを再利用しようとしている場合は問題です。
ブランドン


13

REPLが前の入力を保持するために_使用する名前node.js。別の名前を選択してください。


10
__二重下線?:)
Amc_rtty

3
ダブルアンダースコアは_undよりも優れています:)
Kaushik Thirthappa 2013

-3

注:以下は、次のコード行でのみ機能し、偶然によるものです。

ロダッシュと、

require('lodash');
_.isArray([]); // true

なしvar _ = require('lodash')必要なときにLodash以降は、不思議な世界的にこの値を設定します。


いいえ、これはlodashなどでは機能しません。上記のように、nodeは最後のステートメントの結果をに設定するので、この例で機能します_。あなたの最後の声明の結果はlodash libでした。したがって_.isArray([])次の行で機能しますが、二度と機能しません。
Mark Kahn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.