2015-04-10 7 views
0

То, что я пытаюсь достичь:Создание нового метода массива

[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...] 

Что я здесь делаю неправильно?

+0

Начать с я = 0 вместо я = 1 –

+2

Ваш метод не возвращает 'false', он возвращает' undefined', который является правильным, как у вас нет 'return' где-нибудь в вашем методе. – meagar

+0

1, был просто попыткой, если я изменил его на 0, и я верну его, это всегда false ... –

ответ

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 выше.

+0

http://jsfiddle.net/g8mvne9r/ it return false –

+0

вы не можете сравнивать массивы так, как вы пытаетесь их сравнить. Строгие операторы не сравнивают массивы. Результат '[1, 4, 9] == [1, 4, 9]' также является «ложным». – shennan

+0

ваше решение return '[1, 4, 9, power: function]' Я хочу, чтобы оно было '[1, 4, 9]' ... –

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/

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