2014-01-16 49 views
0

我有以下一段代码,并且在我将Prototype.js包含到页面后,这段代码已经开始崩溃。与原型js的JavaScript冲突

  function JsonArrayByProperty(objArray, prop, direction) { 
      if (arguments.length < 2) throw new Error("sortJsonArrayByProp requires 2 arguments"); 
      var direct = arguments.length > 2 ? arguments[2] : 1; //Default to ascending 

      if (objArray && objArray.constructor === Array) { 
       var propPath = (prop.constructor === Array) ? prop : prop.split("."); 
       objArray.sort(function (a, b) { 
        for (var p in propPath) { 
         if (a[propPath[p]] && b[propPath[p]]) { 
          a = a[propPath[p]]; 
          b = b[propPath[p]]; 
         } 
        } 
        a = a.match(/^\d+$/) ? +a : a; 
        b = b.match(/^\d+$/) ? +b : b; 
        return ((a < b) ? -1 * direct : ((a > b) ? 1 * direct : 0)); 
       }); 
      } 
     } 

它打破了在以下几行错误

Uncaught TypeError: Object #<Object> has no method 'match' 

    a = a.match(/^\d+$/) ? +a : a; 
    b = b.match(/^\d+$/) ? +b : b; 
+0

那么,显然'a'和'b'是对象,而不是字符串... – Andy

回答

3

你的问题很可能开始在这条线:

for (var p in propPath) { 

一旦你添加的prototype.js到你的页面,你不能使用使用for(foo in bar)迭代数组的常见(但不正确)快捷方式。这是因为数组元素不再是简单的字符串或浮点数,它们是完整的“扩展”对象,如果对它们进行正确的迭代,它们恰好返回字符串或浮点数。

for(var i = 0; i < propPath.length; i++) { 

将让你回到正轨。

+0

感谢队友......原来这是调用函数是JSON.stringfy(xxxx)的年龄问题的罪魁祸首,没有与原型工作浮出水面,我将不得不改变现有的代码,你提到的原因。 代码搞砸了这一行调用函数中的数组 'var finalData = jQuery.parseJSON(JSON.stringify(someData));' –

+0

这里有一个很棒的页面:http://api.prototypejs.org/language/Array/ - 阅读关于不使用for/in来循环访问数组的章节。如果你重构你的代码来代替使用'yourArray.each()',你会有更快乐的时光。 – Walter