0

I have a function to sort an array of numbers with radix. If I run the code below and manually create a nested array called sortArr it works. arr = sortArr.flat(); concats properly and arr stays with a length of 5.

var sortArr = Array.from({length:10},()=>[]); also works.

However if I create the sortArr through fill, arr = sortArr.flat(); doesn't concat properly, but keeps multiplying arr by 10 until it crashes.

Why is this happening?

function radix(arr) {
    var max = mostDigits(arr);
    for (let i = 0; i < max; i++) {
        var sortArr = [[], [], [], [], [], [], [], [], [], []];
//2nd way         var sortArr = new Array(10).fill([]);
        for (let j = 0; j < arr.length; j++) {
            var num = getDigit(arr[j], i);
            sortArr[num].push(arr[j]);
        }
        arr = sortArr.flat();
    }
    return arr;
}

function getDigit(num, i) {
    return Math.floor(Math.abs(num) / Math.pow(10, i)) % 10;
}

function digitCount(num) {
    if (num === 0) return 1;
    return Math.floor(Math.log10(Math.abs(num))) + 1;
}

function mostDigits(nums) {
    let maxDigits = 0;
    for (let i = 0; i < nums.length; i++) {
        maxDigits = Math.max(maxDigits, digitCount(nums[i]));
    }
    return maxDigits;
}
console.log(radix([23, 567, 89, 12234324, 90]));
s-e1
  • 85
  • 1
  • 8
  • 2
    `fill([])` creates same sub array reference for each element in master array. It does not fill with a new sub array for each element the way the Array.from mapping callback does – charlietfl Oct 18 '20 at 22:20
  • Can prove this to yourself by using `fill([])` and doing `console.log(sortArr[1] === sortArr[2])` – charlietfl Oct 18 '20 at 22:23

0 Answers0