2014-01-16 5 views
0

У меня есть следующий фрагмент кода, и это начало ломаться после того, как я включил Prototype.js на страницу.конфликт javascript с прототипом js

  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). Это потому, что элементы массива больше не являются простыми строками или плаваниями, они являются полнофункциональными «расширенными» объектами, которые, как правило, оценивают строки или float, если вы правильно их перебираете.

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

вернет вас на правильный путь.

+0

спасибо mate ... оказалось, что вызывающая функция для этого была виновником, когда старая проблема JSON.stringfy (xxxx) не работая с прототипом, и мне придется внести изменения в существующий код по причине, о которой вы говорили. Код был прикручиваем массив в этой строке вызывающей функции 'var finalData = jQuery.parseJSON (JSON.stringify (someData));' –

+0

Здесь есть отличная страница об этом: http://api.prototypejs.org/language/Array/ - читайте раздел о том, как НЕ использовать for/in для цикла над массивом. Если вы реорганизуете свой код для использования 'yourArray.each()' вместо этого, у вас будет гораздо более счастливое время. – Walter

Смежные вопросы