2013-09-18 2 views
0

Так как я должен был удалить некоторые элементы из моих массивов, я последовал за несколько кусков коды, найденных в StackOverflow и придумал это:Javascript Array.prototype печатается почти везде

Array.prototype.remove = function(from, to) { 
    var rest = this.slice((to || from) + 1 || this.length); 
    this.length = from < 0 ? this.length + from : from; 
    return this.push.apply(this, rest); 
}; 

По некоторым причинам, однако этот фрагмент кода печатается ВСЕГДА, когда что-то имеет что-то с массивом.

Пример:

этот кусок кода:

Array.prototype.remove = function(from, to) { 
    var rest = this.slice((to || from) + 1 || this.length); 
    this.length = from < 0 ? this.length + from : from; 
    return this.push.apply(this, rest); 
}; 

Scadenza.prototype.init = function() { 
    this.promemoria = (this.promemoria == "")?("NO"):(this.promemoria); 
    var gruppo = this.group; // convert array to string. 
    this.group = ""; 
    for (var i in gruppo) { 
     if (i != (gruppo.length - 1)) { 
      this.group += gruppo[i] + ", "; 
     } 
     else { 
      this.group += gruppo[i]; 
     } 
    } 
    alert(this.group); 
}; 

Этот фрагмент кода должен преобразовать this.group массива (временно хранятся в переменной «Gruppo») в строку (это совершенно очевидно, я думаю).

Это, конечно, делает его работу значительно, если он не будет, что его предупреждение является:

[НЕОБХОДИМЫЕ ДАННЫЕ] функция (от, до) {вар остальное = this.slice ((to || from) + 1 || this.length); this.length = от < 0? this.length + from: from; return this.push.apply (это, отдых); }

Этот фрагмент код в настоящее время также отправляется в базу данных через запрос AJAX и результат запроса, при желаемой coloumn, это одно:

функции (от, до) {var rest = this.slice ((to || from) + 1 || this.length); this.length = от < 0? this.length + from: from; вернуть это.push.apply (это, отдых); },

Я очень удивлен, что это происходит, но у меня нет абсолютно никакой идеи о том, как это исправить.

При загрузке страницы или нажатии кнопки, которая выбрасывает это событие, при загрузке страницы не было обнаружено никаких ошибок.

Любая идея?

ps: Не уверен, что помогает, но я использую jQuery.

@comments:

Нормальный цикл на самом деле не исправить это:

Scadenza.prototype.init = function() { 
    this.promemoria = (this.promemoria == "")?("NO"):(this.promemoria); 
    var gruppo = this.group; // convert array to string. 
    this.group = ""; 
    for (var i = 0; i < gruppo.length; i++) { 
     if (i != (gruppo.length - 1)) { 
      this.group += gruppo[i] + ", "; 
     } 
     else { 
      this.group += gruppo[i]; 
     } 
    } 
    alert(this.group); 
}; 

оповещения по-прежнему то же самое.

+0

Возможный дубликат [Почему используется «для ... в» с итерацией массива такая плохая идея?] (Http://stackoverflow.com/questions/500504/why-is-using-for-in-with -array-iteration-such-the-bad-idea) – Bergi

+0

Это не работает ни с обычным циклом, спасибо. – briosheje

+0

Он делает. Возможно, вы не исправили все вхождения циклов 'for in' ... Что содержит' this.group'? Возможно, методы '.toString()' элементов также делают это неправильно. – Bergi

ответ

4

Использовать надлежащие for (var i=0; i<arr.length; i++) петли для итерационных массивов. for in enumerations will enumerate prototype properties as well, не используйте их на массивах. Вы делаете это в своем методе init, например.

Btw, для выполнения этой задачи вы хотите использовать .join все равно:

Scadenza.prototype.init = function() { 
    if (this.promemoria == "") 
     this.promemoria = "NO"; 
    this.group = this.group.join(", "); // convert array to string 
    alert(this.group); 
}; 
+0

После удаления array.prototype.remove и использования .join он исправил это, спасибо! Любая идея, однако, почему это происходило даже с нормальным для петель? – briosheje

+0

Я не сказал, чтобы удалить 'Array.prototype.remove'. Это не происходит с обычными циклами. Либо у вас была какая-то проблема с кешированием с кодом, либо вы заметили появление 'for in' (возможно, в методах' this.group [i] .toString'?). Просьба представить автономный пример, демонстрирующий такое поведение, если вы все еще страдаете от проблемы. – Bergi

+0

По какой-то причине это исправлено, больше никаких случайных функций не обрабатывается, но я, конечно же, больше не буду использовать (для переменной в массиве) массивы, спасибо! Он подходит для объектов, так или иначе? – briosheje

3

При изменении Array прототипа, метод добавляется к объекту Array, как новый атрибут. Когда вы выполняете итерацию с for (var attr in object), вы повторяете объект и все его атрибуты. Поэтому ваш новый метод включен в этот цикл.

Вам необходимо использовать петлю for (var i=0; i<a.length; i++). Это будет включать только элементы в массиве.

+0

Как уже было написано выше, это не исправляет! Я все еще получаю такое же предупреждение ... – briosheje

+0

вы можете показать нам, как вы назначаете this.group до того, как она будет назначена 'gruppo' в вашем методе' init'? –

+0

Я исправил его с помощью .join, так или иначе, this.group было назначено, беря значения из флажков, выталкивая их в массив Возможно, там что-то не так, но с помощью .join исправил это! – briosheje

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