繁体   English   中英

Javascript | 设置数组的所有值

[英]Javascript | Set all values of an array

代码

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

结果

一条警告消息:

42,42,42

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

没有内置方法,您必须遍历所有方法:

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/ )。

不过,有些人不赞成扩展内置类型的原型。

EDIT ES5 引入了一种方法来安全地扩展Object.prototypeArray.prototype而不会中断for... in...枚举:

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

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

ES6 方法非常干净。 所以首先你初始化一个 x 长度的数组,然后调用它的fill方法。

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

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

[9, 9, 9]

map是这个问题最合乎逻辑的解决方案。

let xs = [1, 2, 3];
xs = xs.map(x => 42);
xs // -> [42, 42, 42]

但是,如果数组有可能是稀疏的,则需要使用for或者更好的是for.. of

看:

现在是 2019 年,你应该使用这个:

let arr = [...Array(20)].fill(10)

所以基本上20length或新的实例化Array

实际上,您可以使用这种完美的方法:

let arr = Array.apply(null, Array(5)).map(() => 0);
// [0, 0, 0, 0, 0]

此代码将创建数组并用零填充它。 要不就:

let arr = new Array(5).fill(0)

使用for循环并依次设置每个循环。

其他答案是好的,但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);
}

但可能并非在任何地方都有效。 :-)

在使用 Epicycles 时发现了这一点 - 显然有效 - 我的眼睛看不到“p”。

/** Convert a set of picture points to a set of Cartesian coordinates */
function toCartesian(points, scale) {
  const x_max = Math.max(...points.map(p=>p[0])),
  y_max = Math.max(...points.map(p=>p[1])),
  x_min = Math.min(...points.map(p=>p[0])),
  y_min = Math.min(...points.map(p=>p[1])),
  signed_x_max = Math.floor((x_max - x_min + 1) / 2),
  signed_y_max = Math.floor((y_max - y_min + 1) / 2);

  return points.map(p=>
  [ -scale * (signed_x_max - p[0] + x_min),
  scale * (signed_y_max - p[1] + y_min) ] );
}

您可以使用空语句

 const arr = [1, 2,3]; for (let i = 0; i < arr.length; arr[i++] = 42); console.log(arr);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM