This is the same old problem with arrays (and objects in general) being references rather than values.
Specifically, when you do arr.fill([])
, you are taking that one single empty array and using that to fill the parent one.
It's like saying:
var arr = new Array(5);
arr[0] = arr[1] = arr[2] = arr[3] = arr[4] = [];
They all refer to the same array! So when you then go on to modify one of them, it looks like they're all modified (but really it's still the same one)
Unfortunately there's no simple way to assign an empty array to each one. You could do something like:
Array.apply(null, Array(5)).map(function() {return [];});
Essentially, create an (initialised) empty array of length 5 and map each (empty) value to a new []
.
EDIT: Seems like I'm stuck in old times. As per @torazaburo's comment, you can use Array.from
instead of Array.apply(null, Array(5)).map
, like so:
Array.from( new Array(5), function() { return []; } );
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…