0

powershell、bash(|)、f#(|>)などのJavaScriptパイプラインを作成したいと思います。つまり。に相当するもの

getstuff() | sort() | grep("foo") | take(5)

私はこれについての議論をcoffeescriptフォーラムで見ましたが、関数チェーンで同じことができるとみんなが言ったので、結局彼らはそれを棚上げにしました。しかし、私が見る限り、getstuffが必要なものは、sortメソッドを持つものを返します。sortメソッドは、grepメソッドなどを含むものを返す必要があります。これは、すべての潜在的なパイプラインメンバーが事前にお互いについて知っている必要があるため、かなり制限されます。JavaScriptにはかなり巧妙なトリックが含まれていることを知っていますが、私はまだ101レベルにいます-これは実行可能です

getstuff().sort.().grep().take()

その制約なしで

4

4 に答える 4

2

これは実行可能ですか

getstuff().sort.().grep().take()

その制約なしで

いいえ。


短い答えが好きです!そのようなことができる方法を提案できますか

大まかに言えば、jQueryが内部で行うのと同様のことを実行して、連鎖を可能にすることができます。呼び出すことができるようにしたいすべての関数を持つ配列のようなラッパーオブジェクトタイプを作成します。連続する各連鎖呼び出しは、明示的に渡された引数に加えて、内部スタックで動作できます。

死んだjQueryの馬を打ち負かし続けるのではなく、私が話していることを理解するための最良の方法の1つは、jQueryのコアソースコードを掘り下げて、連鎖がどのように機能するかを理解することです。

于 2011-08-31T22:29:25.777 に答える
2

必要な種類の関数チェーンをサポートするオブジェクトを定義するのは、実際には非常に簡単です。

getStuff = ->
  sort: ->
    # set @stuff...
    this
  grep: (str) ->
    # modify @stuff...
    this
  take: (num) ->
    @stuff[num]

それはあなたが仕事をするために必要なすべてですgetstuff().sort.().grep('foo').take(5)

于 2011-08-31T23:05:59.587 に答える
0

次のような適切なメソッドを持つ戻り値を気にせずに、これらの呼び出しを行うことができます。

take(5, grep("foo", sort(getstuff())));

しかし、それでは、各関数に意味のあるデータを渡す必要があるという問題は解決されません。JavaScriptでさえそれほど滑りにくいわけではありません。たとえば、画像に対してsort()を呼び出すことはできますが、結果を生成する意味のある方法はありません。

于 2011-08-31T22:44:55.037 に答える
0

必要なすべてのメソッドが含まれているが、最終値の代わりに使用できる特別なオブジェクトを返すことで、同様のことを行うことができます。たとえば、Arrayこれらすべてのメソッドを含むインスタンスを返すことができます。

var getstuff = function () {
    obj = Array.apply(this, arguments);
    obj.take = function (n) {
        return this[n];
    };
    obj.grep = function (regexp) {
        return getstuff.apply(this, Array.prototype.filter.apply(this, [function (item) {
            return item.toString().search(regexp) !== -1;
        }]));
    };
    obj.splice = function () {
        return getstuff.apply(this, Array.prototype.splice.apply(this, arguments));
    }
    return obj;
}

// shows [-8, 1]
console.log(getstuff(3, 1, 2, 'b', -8).sort().grep(/\d+/).splice(0, 2));
// shows 3
var stuff = getstuff(3, 1, 2, 'b', -8).grep(/\d+/);
console.log(stuff.sort()[stuff.length]);

上記は特に高速な実装ではありませんが、グローバルAllayのプロトタイプをクリーンに保つことで特別なメソッドを使用して配列を返すため、他のコードに干渉することはありません。

でこれらの特別なメソッドを定義することで高速化できArray.prototypeますが、注意が必要です...

または、ブラウザがサブクラス化をサポートしている場合、Array必要なのはsupclassと便利なコンストラクターだけですgetstuff()

于 2011-08-31T23:39:14.823 に答える