1

编辑:

我把它放在首位是因为我终于找到了真正的问题。

Prototypejs 正在添加一个干扰下划线的 Array.reduce 函数(参见:https ://github.com/documentcloud/underscore/issues/7 )

除了“使用原型> 1.6.1)之外,这里似乎没有任何决定性的东西,但不幸的是我无法控制使用什么原型。除了更改 _.reduce 方法以不使用本机函数或代理任何方法使用reduce(见评论)我看不到任何解决这个问题的好方法。


我遇到了一个问题,Prototypejs 与我使用下划线的 javascript“应用程序”包含在同一页面上。

似乎每当我尝试使用函数 _.unique 时,它​​实际上是在调用原型函数,这是在一个闭包内,我正在使用 requirejs 加载 _。当我更改包含的库的顺序时,我的应用程序包含在原型之前,那么一切正常,不幸的是我无法将其用作解决方案,因为我无法控制它是如何包含在任何页面中的。

我想知道是否有人以前遇到过这个问题并且有一个可能的解决方案,其中 _.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]”,而第二个给了我“[]”。这似乎只在原型包含在页面上时才会发生,所以它正在发生一些事情。

我添加了另一个曾经执行过的日志(它永远不会到达这里)。看起来下划线正在执行“本机”reduce 方法,该方法是由 Prototypejs 提供的,它不采用迭代器。

4

1 回答 1

0

是的,Prototype.js 覆盖reduce,这确实是个坏主意。如果reduce是 Prototype.js 唯一搞砸的事情,那么设置Array.prototype.reducenull就在开头_.uniq怎么样?似乎_.intersection_.union两者都依赖_.uniq

 _.uniq = _.unique = function(array, isSorted, iterator) {
     var keepIt = Array.prototype.reduce;
     Array.prototype.reduce = null;
     //....
     Array.prototype.reduce = keepIt;
 };
于 2012-08-01T10:29:44.433 回答