Code
var cool = new Array(3);
cool[setAll] = 42; //cool[setAll] is just a pseudo selector..
alert(cool);
Result
A alert message:
42,42,42
How do I change/set all values of an array to a specific value?
There's no built-in way, you'll have to loop over all of them:
function setAll(a, v) {
var i, n = a.length;
for (i = 0; i < n; ++i) {
a[i] = v;
}
}
http://jsfiddle.net/alnitak/xG88A/
If you really want, do this:
Array.prototype.setAll = function(v) {
var i, n = this.length;
for (i = 0; i < n; ++i) {
this[i] = v;
}
};
and then you could actually do cool.setAll(42) (see http://jsfiddle.net/alnitak/ee3hb/).
Some people frown upon extending the prototype of built-in types, though.
EDIT ES5 introduced a way to safely extend both Object.prototype and Array.prototype without breaking for ... in ... enumeration:
Object.defineProperty(Array.prototype, 'setAll', {
value: function(v) {
...
}
});
EDIT 2 In ES6 draft there's also now Array.prototype.fill, usage cool.fill(42)
Array) is considered bad practice by most.Object.createProperty(Array.prototype, 'setAll', ...)var1 = [...ArrayOfTrue]; var2 = [...ArrayOfFalse] is quicker in my case then var1.fill(true) but it'll be usefull down the line I'm sure.The ES6 approach is very clean. So first you initialize an array of x length, and then call the fill method on it.
let arr = new Array(3).fill(9)
this will create an array with 3 elements like:
[9, 9, 9]
.fill() method as of 2016. However, I found this very useful for use with TypeScript.map is the most logical solution for this problem.
let xs = [1, 2, 3];
xs = xs.map(x => 42);
xs // -> [42, 42, 42]
However, if there is a chance that the array is sparse, you'll need to use for or, even better, for .. of.
See:
Array.prototype.map (you should use forEach to iterate over an array, and .map only if you wish to return a new array based on it) but also requires that the array already have values in it. Both .map and .forEach will ignore array elements that have undefined keys.0 and length - 1 that have no defined value. .map will ignore those elements, leaving the array unfilled. The second .map version fails the OP requirement in that it returns a new array, and does not mutate the original.xs = xs.map() if that's important to you =).map is entirely the wrong tool for the job not just because of its array return semantics but also because of the sparse element skipping.The other answers are Ok, but a while loop seems more appropriate:
function setAll(array, value) {
var i = array.length;
while (i--) {
array[i] = value;
}
}
A more creative version:
function replaceAll(array, value) {
var re = new RegExp(value, 'g');
return new Array(++array.length).toString().replace(/,/g, value).match(re);
}
May not work everywhere though. :-)
Found this while working with Epicycles - clearly works - where 'p' is invisible to my eyes.
/** 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) ] );
}
You can use an empty statement.
const arr = [1, 2 ,3];
for (let i = 0; i < arr.length; arr[i++] = 42);
console.log(arr);