创建新的数组方法

时间:2015-04-10 15:52:36

标签: javascript

我想要实现的目标是:

[1,2,3].power(2) === [1,4,9];

到目前为止,我做到了:

Array.prototype.power = function(value) {
    for (var i = 1; i < this.length; i++) {
        this[i] = Math.pow(this[i], value);
    }
}

但由于某种原因,它返回false,数组看起来像:

[1, 4, 9, power: function...]

我在这里做错了什么?

2 个答案:

答案 0 :(得分:0)

您需要返回数组:

Array.prototype.power = function(value) {
    for (var i = 0; i < this.length; i++) {
        this[i] = Math.pow(this[i], value);
    }
    return this;
}

var powers = [1,2,3].power(2); // [1, 4, 9]

现在进一步深入,在查看数组时,您可能会看到power方法作为数组的一部分列出。这是problems with prototyping the Array之一。

这并不意味着不应该完成数组原型设计。但是要理解,作为一个数组,只要你使用Array方法来查询/迭代它,它仍然会像一个数组一样。

例如,采用上面的代码示例,我仍然可以获得正确的数组长度:

powers.length; // 3

powers.toString() // 1,4,9

如果我用索引号迭代它,我可以得到一个准确的读数:

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

  console.log(powers[i]);

}

// 1
// 4
// 9

非常简单:[1, 4, 9]绝对是使用上述power方法时返回的Array元素。

答案 1 :(得分:0)

如前所述,您无法直接比较数组。但是,您可以编写一个简单的方法来查看值是否匹配:

var arr = [1, 2, 3];
var arr2 = [1, 4, 9];

Array.prototype.power = function(value) {
    for (var i = 0; i < this.length; i++) {
        this[i] = Math.pow(this[i], value);
    }
    return this;
}

Array.prototype.compare = function(value) {   
    if (this.length !== value.length) {
         return false   
    }

    for (var i = 0; i < this.length; i++) {
        if (this[i] !== value[i]) {
         return false;   
        }
    }

    return true;
}

var convertedArray = [1, 2, 3].power(2);
var isEqual = convertedArray.compare(arr2);

注意:这假定数组的长度相同。您可以添加自己的错误处理,直到它们不存在。

https://jsfiddle.net/g8mvne9r/5/