在 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 中连接嵌套数组时测试失败的主要内容,如果未能解决你的问题,请参考以下文章

如何在JavaScript中过滤嵌套数组中的对象?

使用 javascript 数组方法更新 mongoose 中的嵌套数组

javascript在嵌套对象/数组中按值查找

JavaScript属性数组中的嵌套属性

将嵌套数组与Javascript中的唯一元素合并

如何从嵌套数组中拼接出一个数组 - javascript