Javascript array.prototype几乎无处不在

时间:2013-09-18 17:13:15

标签: javascript jquery arrays

由于我不得不从我的数组中删除一些元素,所以我在stackoverflow中找到了几段代码并提出了这个:

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”中)转换为字符串(我认为这很明显)。

当然,如果它不是它的警报,那么它的工作就会很大:

  

[DATA NEEDED]函数(from,to){var rest = this.slice((to || from)   + 1 || this.length); this.length = from&lt; 0? this.length + from:from; return this.push.apply(this,rest); }

这段代码也通过AJAX请求发送到数据库,查询结果在所需的coloumn中就是这样:

  

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

我很惊讶这种情况正在发生,但我绝对不知道如何解决它。

加载页面或单击抛出此事件的按钮时,未发现任何错误。

有什么想法吗?

ps:不确定是否有帮助,但我正在使用jQuery。

@comments:

正常for循环实际上并不能解决这个问题:

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);
};

警报仍然相同。

2 个答案:

答案 0 :(得分:4)

使用正确的for (var i=0; i<arr.length; i++)循环来迭代数组。 for in enumerations will enumerate prototype properties as well,不要在数组上使用它们。您正在使用init方法执行此操作。

顺便说一下,无论如何你想要使用.join

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

答案 1 :(得分:3)

更改Array原型时,该方法将作为新属性添加到Array对象中。当您使用for (var attr in object)进行迭代时,您将迭代对象及其所有属性。因此,您的新方法包含在该循环中。

您需要使用for (var i=0; i<a.length; i++)循环。那只会包含数组中的项目。