【问题标题】:Adding an object to an array within object in javascript在javascript中将对象添加到对象内的数组中
【发布时间】:2017-10-18 16:51:53
【问题描述】:

我对 Javascript 很陌生,但我想创建一个游戏。在游戏中,每次用户玩或完成某个级别时,他们都会积累积分(有点像成就或徽章)。我需要编写一个算法,它不仅可以跟踪用户的积分,而且会在他们完成操作和/或获得必要积分后为他们分配正确的徽章。

我正在考虑为每个玩家创建一个 User 对象,该对象将包含诸如“姓名”、“积分”等属性,以及一个列出玩家迄今为止获得的徽章的数组。徽章本身也将是对象,并且会有描述等级的某些属性。

是否可以在 Javascript 中将一个对象推入另一个对象中?例如:

var daniel = {
  userName: "Daniel White",
  userPoints: 1250,
  userBadges = [ 'Bronze', 'Silver' ],
 }

var goldBadge = {
  badgeName: "Gold",
  minWeight: 1250,
}

注意:“minWeight”属性表明用户必须至少拥有 1250 分才能获得该徽章。

我是否可以通过将 goldBadge 推送到数组 userBadges 来将金色徽章分配给用户 Daniel?还是我做错了?

【问题讨论】:

  • 我会说...对两者都是。您完全可以将黄金推到徽章上,但如果积分是徽章的唯一决定因素,那么只需创建一个函数,该函数接受一个整数并返回一个徽章数组:const getBadges = n => [["gold", 1250], ["silver", 1000]].filter(([name, thres]) => thres <= n).map(([name] => name);。使用对象属性可能在概念上很简单,但您会存储大量重复数据。

标签: javascript arrays algorithm object javascript-objects


【解决方案1】:

我是否可以通过将 goldBadge 推送到数组 userBadges 来将金色徽章分配给用户 Daniel?还是我做错了?

是的,在 javascript 中可以有一个不同类型的数组。在这种情况下:

var daniel = {
  userName: "Daniel White",
  userPoints: 1250,
  userBadges : ['Bronze', 'Silver']}

var goldBadge = {
  badgeName: "Gold",
  minWeight: 1250}

daniel.userBadges.push(goldBadge)

【讨论】:

  • 够简单!谢谢。
【解决方案2】:

是的,您可以简单地将 push 发送到 userBadges 属性。

像这样:

var daniel = {
  userName: "Daniel White",
  userPoints: 1250,
  userBadges = [ 'Bronze', 'Silver' ],
 }


daniel.userBadges.push({
  badgeName: "Gold",
  minWeight: 1250,
})

【讨论】:

    【解决方案3】:

    我是否可以通过将 goldBadge 推送到数组 userBadges 来将金色徽章分配给用户 Daniel?还是我做错了?

    我会说……对两者都是。您完全可以将黄金推到徽章上(其他答案显示了如何这样做),但如果点是徽章的唯一决定因素,那么只需创建一个函数,该函数采用整数并返回徽章数组:

    const badges = [["gold", 1250], ["silver", 1000], /* etc */];
    const getBadgesByScore = score => {
      return badges
        .filter(([name, thres]) => score >= thres)
        .map(([name] => name); 
    };
    
    getBadgesByScore(daniel.score); // ["gold", "silver"...
    

    使用对象属性在概念上可能很简单,但您会存储大量重复数据。

    【讨论】:

    • 那么您认为创建嵌套数组会更有效吗? return 语句之后的代码让我有点困惑。 filter 和 map 方法对数组做了什么?
    • @Gabbykun555 代码是 return 语句的一部分,return 语句之后的代码无法访问。 filter 返回一个通过谓词测试的项目数组 score >= thresholdmap 在数组上“映射”一个函数(在这种情况下,它提取子数组的第一个元素:徽章的名称)。至于有效性,我建议您重视代码的简单性,而不是它与您的对象概念的映射程度。从现在开始的 3-6 个月后,您对问题域的概念可能已经改变,但简单的代码仍然很简单。
    • ...(继续) 举一个更具体的例子来说明我在说什么,我在大学的第一个任务是用 Python 实现一个纸牌游戏。我做了这个大的面向对象的事情,每张卡片都是从类链继承的实例。它基本上是无类型的 Java。在我们提交之后,教授向我们展示了他的代码,该代码是在一个简单列表上的几个循环,该列表使用模数偏移来获取卡片的“列”。这就像我的 100+ 的 12 行。他的代码几乎与卡片建模无关,但又短又快,最重要的是对游戏的正确实现。
    【解决方案4】:

    只需使用push 方法

    var daniel = {
      userName: "Daniel White",
      userPoints: 1250,
      userBadges: ['Bronze', 'Silver']
    }
    
    var goldBadge = {
      badgeName: "Gold",
      minWeight: 1250
    }
    daniel.userBadges.push(goldBadge);
    console.log(daniel)

    【讨论】:

    • 很简单。谢谢!
    • 你可以这样做,但是数据结构非常奇怪和不一致,因为它包含两个字符串和一个对象。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2012-03-11
    • 2021-10-16
    • 2014-07-09
    • 1970-01-01
    相关资源
    最近更新 更多