【问题标题】:cart challenge javascript logic. is there more than one way to solve?购物车挑战 javascript 逻辑。有不止一种方法可以解决吗?
【发布时间】:2018-02-21 19:15:47
【问题描述】:

我刚刚完成了代码学院的 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'); - 那么我似乎在数组中找不到“苹果”。

我试图了解是否需要使用 (.this) 以及是否可以按照我写的方式进行操作。

PS - 对不起,如果它一团糟,我有点难以解释我试图理解的内容:) PSS - 我不只是想解决挑战,而是真正培养“解决问题的编码思维方式”。

谢谢!

【问题讨论】:

  • itemPrice 是在哪里定义的?

标签: javascript arrays syntax logic this


【解决方案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++)

此外,对象通过引用进行比较,但您实际上希望通过值来比较它们。例如。您可以使用 name 属性:

  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;
  }

【讨论】:

    【解决方案2】:

    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'));

    【讨论】:

      【解决方案3】:

      这里有一个明显的问题:

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

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

      我不记得确切的 JS 语法,但它应该类似于

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多