首页 > 解决方案 > Javascript函数在对象数组中调用?

问题描述

我google了很多,但没有找到令人满意的答案。在打字稿中搜索打字错误时遇到了这样的代码:

// @strict: false
let suits = ["hearts", "spades", "clubs", "diamonds"];

function pickCard(x: any): any {
  // Check to see if we're working with an object/array
  // if so, they gave us the deck and we'll pick the card
  if (typeof x == "object") {
    let pickedCard = Math.floor(Math.random() * x.length);
    return pickedCard;
  }
  // Otherwise just let them pick the card
  else if (typeof x == "number") {
    let pickedSuit = Math.floor(x / 13);
    return { suit: suits[pickedSuit], card: x % 13 };
  }
}

let myDeck = [
  { suit: "diamonds", card: 2 },
  { suit: "spades", card: 10 },
  { suit: "hearts", card: 4 },
];

let pickedCard1 = myDeck[pickCard(myDeck)];  //<--- HERE IS DOUBT
alert("card: " + pickedCard1.card + " of " + pickedCard1.suit);

let pickedCard2 = pickCard(15);
alert("card: " + pickedCard2.card + " of " + pickedCard2.suit);

我想明白这样的表达是什么?我是否在一个对象数组中调用一个函数,将该数组作为参数传递?那是正确的吗?为什么不能像这样直接调用函数:

let pickedCard1 = pickCard(myDeck);

我总是这样做我得到未定义的回报。对不起 jr 的问题,但我想更好地理解 javascript。谢谢大家

标签: javascriptarraystypescriptobject

解决方案


你的问题是你离开了你的object分支 - 你正在返回number而不是Card

let pickedCard: number = Math.floor(Math.random() * x.length);
// This is really `pickedCardIndex`

相反,检查传入的值是一个数组Array.isArray,然后在最后一步使用数组索引:

  if (Array.isArray(x)) {
    let pickedCardIndex = Math.floor(Math.random() * x.length);
    return x[pickedCardIndex];
  }

推荐阅读