在 JavaScript 中连接嵌套数组时测试失败
Posted
技术标签:
【中文标题】在 JavaScript 中连接嵌套数组时测试失败【英文标题】:Tests fail when concatenating nested array in JavaScript 【发布时间】:2021-09-02 19:06:29 【问题描述】:实现了一个Radix Sort,它对数字列表进行排序。这是我的代码:
function getDigit(number, index, lengthOfLongestNumber)
let numberString = number.toString();
numberString = numberString.padStart(lengthOfLongestNumber, '0');
return parseInt(numberString[index], 10) || 0;
function getLengthOfLongestNumber(numbers)
// return Math.floor(Math.log10(Math.max(...numbers))) + 1;
let largestNumber = 0;
for (let i = 0; i < numbers.length; i++)
if (numbers[i] > largestNumber)
largestNumber = numbers[i];
return largestNumber.toString().length;
function radixSort(numbers)
const lengthOfLongestNumber = getLengthOfLongestNumber(numbers);
for (let i = lengthOfLongestNumber - 1; i >= 0; i--)
const buckets = new Array(10).fill().map(() => []);
while (numbers.length)
const number = numbers.shift();
buckets[getDigit(number, i, lengthOfLongestNumber)].push(number);
for (let j = 0; j < 10; j++)
// numbers = numbers.concat(buckets[j]); ---> uncomment this line and comment out the following while loop
// numbers = [...numbers, ...buckets[j]]; ---> or uncomment this line and comment out the following while loop
while (buckets[j].length)
numbers.push(buckets[j].shift());
return numbers;
当我在radixSort
函数(内部for
循环内)中使用concat()
将buckets
数组合并到numbers
数组时,测试失败。但如果我改用while
循环,它就会以某种方式通过。
您可以在CodeSandbox 中查看和运行测试。
为什么会这样?它们之间有什么区别导致测试失败?
【问题讨论】:
【参考方案1】:对于 returned 数组,您使用哪些替代方案并不重要,但如果测试希望您对 given 数组进行排序,以便在调用之后输入数组已被排序本身,那么实际上,注释掉的替代方案将不起作用。这是因为那些替代方案分配到numbers
而不是改变它。
忽略返回的数组时只需检查备选方案之间的差异,而是查看给定的数组:
let arr = [521, 219, 100, 422, 889, 529, 491, 777, 641, 882, 229];
radixSort(arr);
console.log(arr);
被注释掉的替代品将记录一个空数组。
正确的版本变异 numbers
,并且没有分配一个(新的)数组给它。
为了避免循环,您也可以像这样执行此突变:
numbers.push(...buckets[j]);
你甚至可以用这一行替换 for
围绕该语句的循环:
numbers.push(...buckets.flat());
【讨论】:
完美!我现在明白radixSort
函数在这两种情况下都会改变 given 数组,但注释掉的行通过分配 a new 数组使其成为空数组。这就是expect([]).toEqual(nums.sort());
通过测试的原因。谢谢!以上是关于在 JavaScript 中连接嵌套数组时测试失败的主要内容,如果未能解决你的问题,请参考以下文章