編集:
iveが最終的に実際の問題を理解したので、これを一番上に置きます。
Prototypejsは、アンダースコアと干渉するArray.reduce関数を追加しています(https://github.com/documentcloud/underscore/issues/7を参照) 。
ここでは「プロトタイプを使用>1.6.1)以外に決定的なものはないようですが、残念ながらどのプロトタイプを使用するかを制御できません。ネイティブ関数を使用しないように_.reduceメソッドを変更するか、メソッドをプロキシする以外はこれはreduceを使用します(コメントを参照)この問題を修正する良い方法がわかりません。
アンダースコアを使用しているJavaScript「アプリ」と同じページにPrototypejsが含まれているという問題があります。
関数_.uniqueを使用しようとすると、実際には代わりにプロトタイプ関数が呼び出されているようです。これはクロージャ内にあり、requirejsを使用して_をロードしています。含まれるライブラリの順序を変更して、プロトタイプの前にアプリが含まれるようにすると、すべてが正常に機能します。残念ながら、これをどのページに含めるかを制御できないため、これをソリューションとして使用することはできません。
誰かが以前にこの問題に遭遇し、_。uniqueがuniqueと呼ばれるグローバルプロトタイプ関数ではなく常にアンダースコア関数を呼び出す可能性のある解決策を持っているかどうか疑問に思いました。
ありがとう
編集:
ユニークな方法が実際に上書きされることについて、私は実際に間違っているかもしれないと思います。アンダースコア関数にコンソールログを追加したところ、呼び出されているようですが、空になっています。
_.uniq = _.unique = function(array, isSorted, iterator) {
console.log("called this");
console.log(array);
var initial = iterator ? _.map(array, iterator) : array;
var results = [];
// The `isSorted` flag is irrelevant if the array only contains two elements.
if (array.length < 3) isSorted = true;
_.reduce(initial, function (memo, value, index) {
console.log("it never gets here");
if (isSorted ? _.last(memo) !== value || !memo.length : !_.include(memo, value)) {
memo.push(value);
results.push(array[index]);
}
return memo;
}, []);
console.log(results);
return results;
};
最初のコンソールログには「[1,2,3,1]」が表示され、2番目のコンソールログには「[]」が表示されます。ただし、これはプロトタイプがページに含まれている場合にのみ発生するように思われるため、何かが起こっています。
これまでに実行された別のログ(ここには表示されません)を追加しました。アンダースコアは、イテレータを使用しないPrototypejsによって提供される「ネイティブ」reduceメソッドを実行しているようです。