While working on Radix sort of integers, new Array(10).fill([]) and Array.from({length: 10}, () => []) both create an array of 10 subarrays, but new Array(10).fill([]) returns a bad result in the context of the radixSort function.
Can someone explain why these two code snippets return wildly different results?
Bad version using Array(10).fill([])
function digitCount(num){
if (num === 0) return 1;
return Math.floor(Math.log10(Math.abs(num))) + 1;
}
function getDigit(num, place){
return Math.floor(Math.abs(num) / Math.pow(10, place)) % 10;
}
function mostDigits(arr){
let largest = 0;
for (let i = 0; i < arr.length; i++)
if (digitCount(arr[i]) > largest)
largest = digitCount(arr[i]);
return largest;
}
function mostDigits(arr){
let maxDigits = 0;
for (let i = 0; i < arr.length; i++)
maxDigits = Math.max(maxDigits, digitCount(arr[i]));
return maxDigits;
}
function radixSort(nums){
let digits = mostDigits(nums);
for (let k = 0; k < digits; k++){
let buckets = new Array(10).fill([]);
for (let i = 0; i < nums.length; i++){
let number = nums[i];
buckets[getDigit(number, k)].push(number);
}
nums = buckets.flat();
}
return nums;
}
radixSort([4, 2, 989, 400, 1900])
Good version using Array.from({length: 10}, () => [])
function digitCount(num){
if (num === 0) return 1;
return Math.floor(Math.log10(Math.abs(num))) + 1;
}
function getDigit(num, place){
return Math.floor(Math.abs(num) / Math.pow(10, place)) % 10;
}
function mostDigits(arr){
let largest = 0;
for (let i = 0; i < arr.length; i++)
if (digitCount(arr[i]) > largest)
largest = digitCount(arr[i]);
return largest;
}
function mostDigits(arr){
let maxDigits = 0;
for (let i = 0; i < arr.length; i++)
maxDigits = Math.max(maxDigits, digitCount(arr[i]));
return maxDigits;
}
function radixSort(nums){
let digits = mostDigits(nums);
for (let k = 0; k < digits; k++){
let buckets = Array.from({length: 10}, () => []);
for (let i = 0; i < nums.length; i++){
let number = nums[i];
buckets[getDigit(number, k)].push(number);
}
nums = buckets.flat();
}
return nums;
}
radixSort([4, 2, 989, 400, 1900])
I expected both of these to work the same since they both create an array with 10 subarrays. I can't find anything online about why they might behave differently.
fill([])is setting it with the same array in every index. It is not a new array in every index.