如何使用数组在JS中创建队列(FIFO)?

时间:2019-07-18 02:53:41

标签: javascript arrays algorithm

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

我不是一个新手,但是我也不擅长JS。但是,我是算法的新手。我看过YouTube视频,以获取有关Queue的帮助。我对这个概念的理解如下:

//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,并说// Display Code的注释,我也要更改该行。

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),但是我是否无法将答案简单地放入数组中?还是我甚至没有提供正确的数字?

6 个答案:

答案 0 :(得分:1)

您应该将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语句中的条件语句是数组中唯一的元素(即数组最初为空),则它可以阻止它移出新元素。

答案 1 :(得分:1)

您可以先进行shift,然后再进行push

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

答案 2 :(得分:0)

您可以使用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('--------------------------------------')

答案 3 :(得分:0)

  

您也可以尝试

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)

答案 4 :(得分:0)

更新:在所有人的帮助下,我不仅能够解决问题,而且理解为什么解决方案是什么!我只需要切换以下代码行即可。显然,他们希望您先推动该项目,然后在阵列上移动。谁会知道大声笑。感谢大家!我不知道如何关闭论坛帖子,所以我将其保留。编码愉快!

答案 5 :(得分:0)

我用两个数组方法实现了fifo功能- concat slice

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