Array.slice() 参数不是函数
我在使用 freeCodeCamp 测试版时遇到了一个奇怪的问题。
这个问题的“目的”不是修改原始数组,而是使用函数式编程技术来修改数组。
但是我不断收到关于“数组”参数的投诉,删除函数不是有效函数:
// the global variable
var bookList = [
"The Hound of the Baskervilles",
"On The Electrodynamics of Moving Bodies",
"Philosophiæ Naturalis Principia Mathematica",
"Disquisitiones Arithmeticae"];
/* This function should add a book to the list and return the list */
// New parameters should come before the bookName one
// Add your code below this line
function add (bookListTemp, bookName) {
let newBookArr = bookListTemp;
return newBookArr.push(bookName);
// Add your code above this line
}
/* This function should remove a book from the list and return the list */
// New parameters should come before the bookName one
// Add your code below this line
function remove (bookList,bookName) {
let newArr = bookList.slice();
if (newArr.indexOf(bookName) >= 0) {
return newArr.slice(0, 1, bookName);
// Add your code above this line
}
}
var newBookList = add(bookList, 'A Brief History of Time');
var newerBookList = remove(bookList, 'On The Electrodynamics of Moving Bodies');
var newestBookList = remove(add(bookList, 'A Brief History of Time'),
'On The Electrodynamics of Moving Bodies');
console.log(bookList);
在删除函数中,我尝试获取参数并执行 array.slice() 方法以及 array.concat() 方法。因为执行
let newArr = bookList
实际上并没有生成一个新数组,对吗?它只是创建一个引用原始数组的新副本,对吗?
我得到的确切错误是
TypeError: bookList.slice 不是一个函数
更奇怪的是
Array.isArray(bookList)
返回
true
(在
function remove
中。所以我不明白为什么它会抱怨数组方法?
您的问题是 Array.push
return The new length property of the object upon which the method was called.
您应该返回数组
function add (bookListTemp, bookName) {
let newBookArr = bookListTemp;
newBookArr.push(bookName);
// Add your code above this line
return newBookArr;
}
或者 让我们尝试 Array.concat
function add (bookListTemp, bookName) {
let newBookArr = bookListTemp;
return newBookArr.concat(bookName);
// Add your code above this line
}
有两种方法可以复制数组而不改变它。您将无法在 bookList 上使用
.slice()
方法,因为它是函数中的参数,因此不是数组。解决方法是
var newBookArr = Array.prototype.slice.call(bookListTemp);
或
[].slice.call(bookListTemp);
这允许您在 bookList 是参数时对其进行切片。我在尝试时发现了另一种方法 -
var newBookArr = [].concat(bookListTemp);
当尝试
var newBookArr = [].push(bookListTemp);
时,我们发现原始 bookList 被推送到新数组中。因此它是一个副本,但作为数组中的数组。
.concat()
方法将旧数组合并到新数组中。