1

我正在看这个作业,我的问题是关于最后加粗的部分:

// Do not edit the code below.
var myGroceryList = ['chips', 'pizza', 'hotpockets', 'MtnDew', 'corndogs'];
// Do not edit the code above.

在这里,我们将编写一个模拟购物和检查杂货清单上的东西并向我们的清单中添加新项目的函数。

编写一个名为 removeItem 的函数,它有两个参数,第一个是myGroceryList,第二个是要从中删除的项目myGroceryList。如果第二个参数(或要添加或删除的项目)与 中的项目匹配myGroceryList,则从您的购物清单中删除该项目并返回新的、更新的购物清单。

一旦你这样做了,写另一个函数addItem,它有两个参数,第一个是myGroceryList,第二个是要添加到你的购物清单的项目。addItem添加您传入的项目,然后myGroceryList返回新的、更新的购物清单。

在 removeItem 和 addItem 中检查“myGroceryList”和“item”参数是否真实。如果不是,则返回一个空数组。

以下是调用函数的一些示例以及应返回的内容:

removeItem(myGroceryList, 'chips') --> ['pizza', 'hotpockets', 'MtnDew', 'corndogs'];
addItem(myGroceryList, 'Jerky') --> ['pizza', 'hotpockets', 'MtnDew', 'corndogs', 'Jerky'];
removeItem(myGroceryList) --> [];
addItem() --> [];

这是我的代码:

removeItem=(myGroceryList,item)=>{
   return myGroceryList.filter((thing)=>{
      return thing != item
   })
}

addItem=(myGroceryList, item)=>{
   myGroceryList.push(item);
   return myGroceryList;
} 

我怎样才能让这最后一步起作用?

4

2 回答 2

2

只需添加一个if来验证两个参数的真实性:

removeItem=(myGroceryList,item)=>{
   if (!myGroceryList || !item) return [];
   return myGroceryList.filter((thing)=>{
      return thing != item
   })
}

不改变论点

当您被要求返回新列表时,您很好地使用filter了原始列表,而不是改变了原始列表。但是您最好将相同的原则应用于addItem,它也应该返回新列表,因此最好不要改变给出的列表:

addItem=(myGroceryList, item)=>{
   if (!myGroceryList || !item) return [];
   return myGroceryList.concat(item); // don't use push, but concat
} 

或者……改变论点?

然而,在赋值结束时给出的示例代码并没有使用函数的返回值(除了控制台报告它),从第二次调用中我们可以看到“chips”实际上已经从的第一次调用的列表removeItem

所以这意味着你必须让你的函数有副作用

在这种情况下,您不应该使用filteror concat,而是将第一个函数更改为 use splice

removeItem=(myGroceryList,item)=>{
   if (!myGroceryList || !item) return [];
   let i = myGroceryList.indexOf(item);
   if (i >= 0) myGroceryList.splice(i, 1); // mutate the list
   return myGroceryList;
}

...并且您可以将您的版本与pushfor一起使用addItem

addItem=(myGroceryList, item)=>{
   if (!myGroceryList || !item) return [];
   myGroceryList.push(item); // mutate...
   return myGroceryList;
} 
于 2021-03-17T13:27:48.113 回答
-1

您可以检查是否为假并立即返回一个空数组,而不是检查是否为真。

   addItem=(myGroceryList, item) => {
      if(!myGroceryList) { return [] }
      myGroceryList.push(item);
      return myGroceryList;
   }
于 2021-03-17T13:23:52.540 回答