【问题标题】:How to make a queue (FIFO) in JS using arrays?如何使用数组在 JS 中创建队列(FIFO)?
【发布时间】:2019-07-18 02:53:41
【问题描述】:

我正在处理有关 FreeCodeCamp 的问题。我需要在数组末尾添加一个数字,然后删除数组的第一个元素。名为 nextInLine 的函数应该返回从中删除的元素。

我不是全新的,但我在 JS 方面也不是很先进。但是,我是算法新手。我看过 Youtube 视频以寻求队列方面的帮助。我对这个概念的理解如下:

//array as queue (FIFO)
const arr = [];
arr.push(5); // [5]
arr.push(7); // [5,7]
arr.push(9); // [5,7,9]
console.log(arr.shift()); // [7,9]
console.log(arr.shift()); // [9]
console.log(arr.shift()); // []

然而,当我试图在我的代码中实现这个想法时,我似乎没有完全理解提出的问题以使其运行。我要修改函数 nextInLine,以及说//显示代码的注释,我也要更改该行。

function nextInLine(arr, item) {
  // Your code here
  arr.push(arr[0]);
  arr.shift();
  return console.log(arr, item);  // Change this line
}

// Test Setup
var testArr = [1,2,3,4,5];

// Display Code
console.log("Before: " + JSON.stringify(testArr));
console.log(nextInLine(testArr)); // Modify this line to test
console.log("After: " + JSON.stringify(testArr));

运行代码时,这就是我所看到的。

nextInLine([], 5) should return a number.
nextInLine([], 1) should return 1
nextInLine([2], 1) should return 2
nextInLine([5,6,7,8,9], 1) should return 5
After nextInLine(testArr, 10), testArr[4] should be 10

我的函数正在输出 /* 2,3,4,5,1 */ 但它似乎不正确。也许我没有将它放入数组中?我在开头有第一个数字 (1),但是我没有简单地将我的答案放在一个数组中吗?或者我什至没有给出正确的数字?

【问题讨论】:

    标签: javascript arrays algorithm


    【解决方案1】:

    你可以先shift,然后push

    function nextInLine(arr, item) {
      var removedElement = arr.shift();
      arr.push(item);
      return removedElement;
    }
    

    【讨论】:

    • 啊,我明白了,您正在创建一个名为“removeElement”的变量并将其分配为文字“已删除元素”,并且您还将返回它。除了推动您决定推动的任何“项目”之外。我似乎明白我缺少什么,即将 shift 方法分配给一个变量,然后返回所述变量。感谢您的输入@Samuel
    【解决方案2】:

    您应该将item 推送到阵列上。您只是将数组的第一个元素移动到末尾,而不添加新元素。

    console.log() 打印它的参数,它不返回它们。所以你的函数只是返回undefined

    function nextInLine(arr, item) {
      arr.push(item); // add new item to end
      return arr.length > 1 ? arr.shift() : null; // remove first item and return it
    }
    

    return 语句中的条件阻止它在新元素是数组中唯一的元素时将其移出,即数组最初为空。

    【讨论】:

    • 哦,对了!我完全忘记了那个 console.log();不返回任何内容,并且显示为未定义。它将记录结果但不将其返回给函数?如果我说得对的话。
    【解决方案3】:

    您可以使用Array.prototype.splice 从数组中删除第一个元素。

    function nextInLine(arr, item) {
      var firstElement = arr[0];
      arr.splice(0, 1);
      arr.push(item);
      return firstElement;
    }
    
    var arr = [];
    console.log('nextInLine(arr, 5) should return undefined and arr should be [5]:');
    console.log('return value:', nextInLine(arr, 5));
    console.log('array:', arr);
    console.log('--------------------------------------')
    
    console.log('nextInLine(arr, 1) should return 5 and arr should be [1]:');
    console.log('return value:', nextInLine(arr, 1));
    console.log('array:', arr);
    console.log('--------------------------------------')
    
    arr = [5,6,7,8,9];
    console.log('nextInLine(arr, 10) should return 5 and arr should be [6, 7, 8, 9, 10]:');
    console.log('return value:', nextInLine(arr, 10));
    console.log('array:', arr);
    console.log('--------------------------------------')

    【讨论】:

    • 太棒了!感谢您的输入@pindev。感谢您的回复。
    【解决方案4】:

    更新:在大家的帮助下,我不仅能够解决,而且了解解决方案的原因,它是什么!我只需要切换以下代码行就可以了。显然他们希望你先推送项目,然后在阵列上移动。谁会知道大声笑。谢谢大家!我不知道如何关闭论坛帖子,所以我将离开它。编码愉快!

    【讨论】:

      【解决方案5】:

      你也可以试试这个

      function nextInLine(arr, item) {
             arr.push(item);
             return arr.shift();
          }
          
          
       var arr = [1,5,6]
       console.log("removed element is : ", nextInLine(arr,10))
       console.log("array is  : ", arr)

      【讨论】:

        【解决方案6】:

        我用两个数组方法做了fifo函数- concat slice

        const nextInLine = (arr, item) => item ? arr.concat(item).slice(1) : arr;
        

        【讨论】:

          猜你喜欢
          • 2017-09-14
          • 1970-01-01
          • 2013-11-15
          • 2010-10-04
          • 2019-01-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多