Javascript | 设置数组的所有值

Tom*_*kay 32 javascript arrays

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

结果

提醒消息:

42,42,42
Run Code Online (Sandbox Code Playgroud)

如何将数组的所有值更改/设置为特定值?

Aln*_*tak 48

没有内置方式,你必须遍历所有这些:

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

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

如果你真的想要,请这样做:

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

然后你可以真正做到cool.setAll(42)(见http://jsfiddle.net/alnitak/ee3hb/).

但是,有些人对扩展内置类型的原型感到不满.

编辑 ES5引入的方式安全地扩展双方Object.prototypeArray.prototype没有打破for ... in ...列举:

Object.defineProperty(Array.prototype, 'setAll', {
    value: function(v) {
        ...
    }
});
Run Code Online (Sandbox Code Playgroud)

编辑2在ES6草案中,现在也有Array.prototype.fill用法cool.fill(42)


Far*_*ina 22

ES6方法很干净.首先你初始化一个x长度的数组,然后调用fill它的方法.

let arr = new Array(3).fill(9)
Run Code Online (Sandbox Code Playgroud)

这将创建一个包含3个元素的数组,如:

[9, 9, 9]
Run Code Online (Sandbox Code Playgroud)

  • 这应该是2019年最好的答案 (3认同)

mus*_*.0x 20

map 是这个问题最合理的解决方案.

let xs = [1, 2, 3];
xs = xs.map(x => 42);
xs // -> [42, 42, 42]
Run Code Online (Sandbox Code Playgroud)

但是,如果阵列有可能是稀疏的,那么你需要使用for或甚至更好for .. of.

看到:

  • 糟糕的答案 - 这不仅是对'Array.prototype.map`的误用(你应该使用`forEach`迭代一个数组,只有当你希望_`return``一个新的数组时才使用`.map`在它上面)还要求数组_already中已有值.`.map`和`.forEach`都将忽略具有未定义键的数组元素. (4认同)
  • @ mustafa.0x不,它“不设置数组的所有值”。JS数组可以是稀疏的,即在'0'和'length-1'之间可以有没有定义值的元素。.map将忽略这些元素,从而使数组未填充。第二个`.map`版本未满足OP要求,因为它返回_new_数组,并且不对原始数组进行突变。 (2认同)