【问题标题】:Function returning undefined after calling in string在字符串中调用后返回未定义的函数
【发布时间】:2018-02-25 19:06:36
【问题描述】:

我正在尝试使用 JS 制作购物车,我的任务之一是创建 placeOrder 函数。

  • placeOrder() 函数接受一个参数,即信用卡号。

  • 如果没有收到参数,该函数应打印出对不起,我们没有为您存档的信用卡。

  • 如果收到卡号,该函数应打印出Your total cost is $71, which will be charged to the card 83296759。然后,它应该清空购物车数组。

但是,当我将总函数调用到字符串中时,会一直返回 undefined。

var cart = [];

function getCart() {
  return cart;
}

function setCart(c) {
  cart = c;
  return cart;
}

function addToCart(itemName) {
  var object = {
    [itemName]: Math.floor(Math.random(1, 100) * 100)
  };
  cart.push(object);
  console.log(`${itemName} has been added to your cart`);
  return cart;
}

function total() {
  if (cart.length !== 0) {
    var totalValue = [];
    for (var i = 0; i < cart.length; i++) {
      for (var item in cart[i]) {
        totalValue.push(cart[i][item]);
        var sum = totalValue.reduce(function(a, b) {
          return a + b;
        }, 0);
        console.log(`The total value is ${sum}`);
      }
    }
  } else {
    return ("Your shopping cart is empty.")
  }
}

function placeOrder(cardNumber) {
  if (cardNumber === undefined) {
    return ("Sorry, we don't have a credit card on file for you.");
  } else {
    console.log(`Your total cost is $${total()}, which will be charged to the card ${cardNumber}`);
    cart = [];
    return cart;
  }
}

addToCart("a");
addToCart("be");
addToCart("cart");
placeOrder(14564);

输出:

Your total cost is $undefined, which will be charged to the card 14564

【问题讨论】:

  • 请删除所有不必要的代码
  • 如果购物车不为空,您的函数不会返回任何内容。 console.logreturn。应尽量少用console.log,调试时除外。
  • @SlavaKnyazev 没有,我添加了所有我调用的。
  • @Carcigenicate 我的错,我会改写问题,但是,我尝试使用 return 并得到相同的输出
  • @Rookie 只需从total 返回sum。我不确定你尝试了什么,但这会奏效。

标签: javascript arrays oop


【解决方案1】:

当 cart.length != 0 时,函数 total 不返回。 你必须返回总和。

if (cart.length !== 0) {
    var sum = 0;
    for(var i=0; i< cart.length; i++) {
      for(var item in cart[i]) {
        totalValue.push(cart[i][item]);
        sum = totalValue.reduce(function(a, b) {return a + b;}, 0);
        console.log(`The total value is ${sum}`);    
      }
    }
    return sum;
}

【讨论】:

    【解决方案2】:

    正如@Carcigenicate 所说,您应该在 if(cart.length !== 0) {} 语句的末尾调用 return 一些东西。请记住,当调用 return 时,该函数会立即停止执行,而不会对进一步的指令进行评估。

    【讨论】:

      【解决方案3】:
      • 我不知道该数组 totalValue 的用途是什么,但您不需要该函数 reduce,只需遍历项目并求和即可。
      • 您正在遍历每个项目的值,直接使用Object.values(cart[i]).pop(); 获取您的项目数量。

      var sum = 0;
      for (var i = 0; i < cart.length; i++) {
        var amount = Object.values(cart[i]).pop();
        sum += amount;        
      }
      

      最后,返回sum

      var cart = [];
      
      function getCart() {
        return cart;
      }
      
      function setCart(c) {
        cart = c;
        return cart;
      }
      
      function addToCart(itemName) {
        var object = {
          [itemName]: Math.floor(Math.random(1, 100) * 100)
        };
        cart.push(object);
        console.log(`${itemName} has been added to your cart`);
        return cart;
      }
      
      function total() {
        if (cart.length !== 0) {
          var sum = 0;
          for (var i = 0; i < cart.length; i++) {
            for (var item in cart[i]) {
              sum += cart[i][item];        
            }
          }
          console.log(`The total value is ${sum}`);
          
          return sum;
        }
        
        return -1; // Could be 0, this is up to you.
      }
      
      function placeOrder(cardNumber) {
        if (cardNumber === undefined) {
          return ("Sorry, we don't have a credit card on file for you.");
        } else {
        
          var sum = total();
          if (sum) {
          console.log(`Your total cost is $${sum}, which will be charged to the card ${cardNumber}`);
          } else {
            console.log("Your shopping cart is empty.")
          }
          cart = [];
          return cart;
        }
      }
      
      addToCart("a");
      addToCart("be");
      addToCart("cart");
      placeOrder(14564);

      【讨论】:

        【解决方案4】:

        您需要确保 total 始终返回 number,例如:

        var cart = [{
            "a": 86
          },
          {
            "be": 2
          },
          {
            "cart": 24
          }
        ];
        
        function total(cart) {
          return cart
            .reduce(function(prices, item) {
              return prices.concat(Object.keys(item).map(k => item[k]));
            }, [])
            .reduce(function(sum, price) {
              return sum += price;
            }, 0);
        }
        
        console.log(total([]));
        console.log(total(cart));

        placeOrder 中的用法可能如下所示:

        function total(cart) {
          return cart
            .reduce(function(prices, item) {
              return prices.concat(Object.keys(item).map(k => item[k]));
            }, [])
            .reduce(function(sum, price) {
              return sum += price;
            }, 0);
        }
        
        function placeOrder(cardNumber, cart) {
          if (cardNumber === undefined) {
            return "Sorry, we don't have a credit card on file for you.";
          }
        
          if (cart.length === 0) {
            return "You cart is empty";
          }
        
          return `Your total cost is $${total(cart)}, which will be charged to the card ${cardNumber}`;
          return [];
        }
        
        console.log(placeOrder(1234, []));
        console.log(placeOrder(1234, [{
          a: 1
        }, {
          b: 2
        }]));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-03
          • 2021-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-02
          相关资源
          最近更新 更多