【问题标题】:javascript prototype loop for in array数组中的javascript原型循环
【发布时间】:2013-05-14 02:55:08
【问题描述】:

我正在开发一个使用大量“javascript”的项目。 我有很多“ajax”调用,它们总是返回一个“json”数组。 出于有用的原因,我创建了 Array 对象的两个原型(“in_array”函数和“shuffle”函数)。

自从我做了原型,我所有的“for in”循环都被打破了(两次显示“未定义”......) 我查看了 google 和 stackoverflow,现在我知道我的错误了。 当然,如果我删除我的原型,“未定义”就会消失。

但是,我没有找到所有答案。

首先,我看到很多时候,使用“for in”循环不好,为什么?

我也使用“PHP”或“python”进行开发,并且我确实喜欢“for in”或“foreach”循环。

其次,我有很多“for in”循环,老实说,我更喜欢改变我的原型,而不是改变我的循环。将我的原型切换到正常功能并保持“for in”循环是否很脏?

第三,我读到 JQuery 可以纠正这个错误。我的项目确实有 JQuery,解决方案是什么(我只读到 JQuery 可以纠正这个问题,而不是如何纠正)。

谢谢,

编辑: 我的原型代码:

// FONCTIONS ARRAY
Array.prototype.shuffle = function () {
for (var i = this.length - 1; i > 0; i--) {
    var j = Math.floor(Math.random() * (i + 1));
    var tmp = this[i];
    this[i] = this[j];
    this[j] = tmp;
}

return this;
}

Array.prototype.in_array = function (needle) {
    for(var i = 0; i < this.length; i++) {
       if(this[i] == needle)
           return true;
    }
    return false;
}

【问题讨论】:

  • 你是如何定义你的原型的?你的for .. in 循环怎么样?您是否添加了hasOwnProperty 支票? (跳过原型)。不要在非框架代码中使用forfor .. in,写一个map函数。
  • 不,我的目标是尽量不在我的所有循环中添加一些东西(在我的代码中有超过 50 个“for in”。
  • 然后写一个map函数。
  • 什么是地图功能?像 PHP 中的 array_map 一样?我们在 JS 中如何做?谢谢你:)

标签: javascript jquery loops prototype for-in-loop


【解决方案1】:

这是地图函数的外观。这是我脑子里写的,所以可能有错误。

function object_map(object, callback) {
    var key, ret = {};
    for (key in object) {
        if (Object.prototype.hasOwnProperty.call(object, key)) {
            ret[key] = callback(key, object[key]);
        }
    }
    return ret;
}

【讨论】:

    【解决方案2】:

    你的问题出现了:

    1. 因为您正在向Array.prototype 添加(可枚举)函数,然后在您枚举任何数组时出现。

    2. 因为您不应该使用for ... in 来枚举数组,而只能用于枚举对象键。

    如果您知道自己在 ES5 浏览器上运行,您可以使用 Object.defineProperty 安全地将函数添加到 Array.prototype

    Object.defineProperty(Array.prototype, 'shuffle', {
        value: function() {
            ...
        }
    });
    

    默认创建不可枚举的属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-15
      相关资源
      最近更新 更多