购物车挑战javascript逻辑。有多种方法可以解决?

时间:2018-02-21 19:15:48

标签: javascript arrays syntax logic this

我刚刚完成了代码学院的JS简介,所以我对此有点新鲜。 请查看购物车挑战赛的以下2段代码。 第一个是我在网上找到的正确代码,其中它扫描已定义的数组,然后输入一条信息(在本例中为“item”)另一条信息的输出(“price”)收到了。

以下是“正确”的解决方案:

// Declare Array

var shoppingCart = [];

// Declare function addToCart 

addToCart = function(name,price) {
  this.name = name;
  this.price = price;
  shoppingCart.push(this.name,this.price);
};

function priceCheck(itemName) {
  var i = 0;
  for(i; i <= shoppingCart.length; i++) {
    if(itemName === shoppingCart[i]) {
     console.log(shoppingCart[i += 1]);
     break;
    }
      else {console.log("the searched item is not in the shopping cart");}
  }
}

如你所见,这个人用过.this。

在我的代码中,我刚刚添加了一个对象(就像被指示的那样)。 我的逻辑是完全关闭的,还是我只需要做一些修理?

我的代码:

shoppingCart = [];

function addToCart(itemName, itemPrice){
 const shiny = {
  name: itemName,
  price: itemPrice
 };
 shoppingCart.push(shiny);
 console.log(shoppingCart);
}

function priceCheck(itemName){
  for(i=0;i<=shoppingCart.length; i++){
    if(itemName===shoppingCart[i]){
      return itemPrice;
    } else{
      console.log('item isnt in cart');
  }}}

addToCart('apple',20);
console.log(shoppingCart);
priceCheck('apple');

它工作正常,直到达到priceCheck('apple'); - 然后它看起来我在阵列中找不到'apple'。

我试着理解我是否需要使用(.this),如果我能按照我写的方式去做。

PS - 对不起,如果它一团糟,我有点难以解释我试图理解的东西:) PSS - 我不只是想解决这个挑战,而是真正开发出“问题的编码思维”。

THX!

3 个答案:

答案 0 :(得分:1)

“正确”的解决方案?而不是。

 addToCart = function(name,price) {

这是未声明的和不必要的函数表达式。人们应该这样做:

 function addOne(name, price){

在这里访问this并不是一个好的做法,因为它具有误导性。如果您只是引用OOP代码,我将始终只使用this。另外,以下内容对我没有意义:

 shoppingCart.push(this.name,this.price);

因为将名称和价格添加为不同的数组元素。这设置了从未使用过的变量(为什么??):

 this.name = name;
 this.price = price;

因此,您的解决方案实际上比“正确”的IMO更好。但是有一些事情:

for(i=0;i<=shoppingCart.length; i++){

迭代直到i等于长度,但由于数组为零,因此该位置没有元素。做:

 for(let i = 0; i < shoppingCart.length; i++)

此外,通过引用比较对象,但实际上您希望按值比较它们。例如。你可以取名称属性:

  if(name === shoppingCart[i].name)

小风格小费,不要这样做:

}}}

我将如何做到这一点:

  const cart = [];

  function addToCart(name, price){
    cart.push({name, price});
  }

  function priceOf(findName){
    for(const {name, price} of cart)
       if(findName === name) return price;
    return NaN;
  }

答案 1 :(得分:0)

这里有一个明显的问题:

if(itemName===shoppingCart[i]){

您将itemName与包含名称和价格的对象进行比较,而不是名称。

我不记得确切的JS语法,但它应该像

if (itemName === shoppingCart[i].name) { 

答案 2 :(得分:0)

shoppingCart[i]是一个对象,nameprice是其属性。

您需要改为访问对象的属性。

itemName == shoppingCart[i]替换为itemName == shoppingCart[i].name,然后您可以使用shoppingCart[i].price

获取价格

shoppingCart = [];

function addToCart(itemName, itemPrice){
 const shiny = {
  name: itemName,
  price: itemPrice
 };
 shoppingCart.push(shiny);
 console.log(shoppingCart);
}

function priceCheck(itemName){
  for(i=0;i<=shoppingCart.length; i++){
    if(itemName===shoppingCart[i].name){//here
      return shoppingCart[i].price;//here
    } else{
      console.log('item isnt in cart');
  }}}

addToCart('apple',20);
console.log(shoppingCart);
console.log(priceCheck('apple'));