2011-04-27 25 views
18

代碼Javascript |將數組的所有值

var cool = new Array(3); 
cool[setAll] = 42; //cool[setAll] is just a pseudo selector.. 
alert(cool); 

結果

一個警告消息:

42,42,42 

如何更改/設置數組的所有值到一個特定的值?

回答

34

有沒有內置的方式,你必須遍歷所有的人:

function setAll(a, v) { 
    var i, n = a.length; 
    for (i = 0; i < n; ++i) { 
     a[i] = v; 
    } 
} 

http://jsfiddle.net/alnitak/xG88A/

如果你真的想,這樣做:

Array.prototype.setAll = function(v) { 
    var i, n = this.length; 
    for (i = 0; i < n; ++i) { 
     this[i] = v; 
    } 
}; 

,然後你可以真正做到cool.setAll(42)(見http://jsfiddle.net/alnitak/ee3hb/)。

有些人看不慣擴展內置類型的原型,雖然。

編輯 ES5介紹了一種方法來安全地擴展雙方Object.prototypeArray.prototype不破壞for ... in ...枚舉:

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

EDIT 2在ES6草案現在Array.prototype.fill還有還有,使用cool.fill(42)

+6

謝謝你的存在! – Tomkay 2011-04-27 10:52:40

+36

不要感謝我 - 謝謝我的父母! ;) – Alnitak 2011-04-27 10:55:31

+0

我覺得有必要在這裏添加一個警告:擴展本地對象(在這種情況下'Array')大多數被認爲是不好的做法。 – Ben 2014-06-20 18:15:06

3

使用for循環,並設置每個反過來。

1

其他答案是好的,但while循環似乎更爲合適:

function setAll(array, value) { 
    var i = array.length; 
    while (i--) { 
    array[i] = value; 
    } 
} 

更有創意的版本:

function replaceAll(array, value) { 
    var re = new RegExp(value, 'g'); 
    return new Array(++array.length).toString().replace(/,/g, value).match(re); 
} 

可能無法工作無處不在,但。 :-)

+0

反向數組循環的好選擇,我們需要更多的js land – 2016-02-13 06:04:10

16

晚了一點,但是這是可能使用Array.map,這是不錯的瀏覽器和IE9 +可用。

var xs = [1, 2, 3]; 
xs.map(function(x, i, ar){ 
    ar[i] = 42; 
}); 
xs; // -> [42, 42, 42] 

編輯:稍微更簡潔:

var xs = [1, 2, 3]; 
xs.map(function(){ 
    return 42; 
}); // -> [42, 42, 42] 
+4

我在「體面的瀏覽器和IE9 +」上大聲笑了起來。做得好。 – kfrncs 2013-11-19 16:42:04

+3

不好的答案 - 這不僅是對'Array.prototype.map'的濫用(你應該使用'forEach'來遍歷一個數組,而'.map'只有當你希望_'return'_一個新的數組時基於它),但也要求數組_already在it_中有值。 '.map'和'.forEach'都會忽略具有未定義鍵的數組元素。 – Alnitak 2015-01-03 21:02:53

+0

@Alnitak查看點#1的第二個代碼示例,並不明白爲什麼點#2使這個答案不好。這種方法是否「設置數組的所有值」?是。 – 2015-01-19 05:34:38

-1

試試這個:

for(var i in array) array[i]=fixedValue; 
+0

不,不要 - 'for ... in'用於對象鍵,而不是數組。 – Alnitak 2015-01-03 21:07:38

11

的ES6的做法是很乾淨。所以首先初始化一個x長度的數組,然後調用其上的fill方法。

let arr = new Array(3).fill(9) 

這將創建一個像3個元素的數組:

[9, 9, 9] 
+0

不幸的是,截至2016年,'.fill()'方法對瀏覽器的支持很少。但是,我發現這對於使用TypeScript非常有用。 – Marquizzo 2016-09-29 16:35:21

+0

@MarcoDelValle這不是一個polyfill問題 – Pawel 2017-02-04 18:49:15

相關問題