【问题标题】:How to access the properties of a random object in an array?如何访问数组中随机对象的属性?
【发布时间】:2015-08-25 20:43:45
【问题描述】:

我有一个对象数组。它们中的每一个都具有与其他相同的属性,但值不同。我想访问此数组中随机对象的属性,但只访问一次 - 所以当我随机获取该对象时,它不会再出现在数组中了。

所以,我创建了一个只有三个对象的数组作为开始,并创建了一个函数,该函数将通过单击一个按钮来调用。该函数创建 2 个变量 - 一个用于存储从 Math.random() 和数组长度相乘收到的随机数,由 Math.floor() 四舍五入。

第二个变量存储从数组中删除的一项(每次都是随机的),并且应该返回它。

这个想法是每次当用户点击按钮来获得一张唯一的卡片,而不是能够再次获得同一张卡片。 它可以工作,但不完全正确 - 有时,单击按钮后,用户什么也得不到,控制台中的消息是“Uncaught TypeError: Cannot read property 'background' of undefined”。

欢迎任何建议。谢谢。

这是我的代码:

var TarotContainer = [];
TarotContainer[0] = {name: "The Fool", background: "url('theFool.jpg')"}
TarotContainer[1] = {name: "The Magician", background: "url('theMagician.jpg')"}
TarotContainer[2] = {name: "The High Priestess", background: "url('theHighPriestess.jpg')"}

function getRandomTaroCard(){
    var randomCard = Math.floor(Math.random() * TarotContainer.length); 
    var pickedRandomCard = TarotContainer.splice(randomCard, 1);
    document.getElementById('card').style.backgroundImage = pickedRandomCard[randomCard].background;
    document.getElementById('card').style.backgroundRepeat = "no-repeat";                                                         

}

【问题讨论】:

  • 您知道splice 的工作原理吗?你为什么要使用它?
  • 我使用 splice() 是因为我只想使用数组中的随机项一次,然后将其从中删除。有没有更好的方法?
  • 是的,那很好。您可能应该接受 pgoggijr 的回答。

标签: javascript arrays random javascript-objects


【解决方案1】:

来自Mozilla Javascript Reference Array.prototype.splice() 返回的内容:

包含已删除元素的数组。如果只有一个元素 删除,返回一个元素的数组。如果没有元素 删除后,返回一个空数组。

这意味着你必须取pickRandomCard的第一个元素([0])。

像这样:

var TarotContainer = [];
TarotContainer[0] = {name: "The Fool", background: "url('theFool.jpg')"}
TarotContainer[1] = {name: "The Magician", background: "url('theMagician.jpg')"}
TarotContainer[2] = {name: "The High Priestess", background: "url('theHighPriestess.jpg')"}

function getRandomTaroCard(){
    var randomCard = Math.floor(Math.random() * TarotContainer.length); 
    var pickedRandomCard = TarotContainer.splice(randomCard, 1);
    document.getElementById('card').style.backgroundImage = pickedRandomCard[0].background;
    document.getElementById('card').style.backgroundRepeat = "no-repeat";   

【讨论】:

  • 所以,当移除的item只有一个时,一个包含一个item的数组就创建好了。它始终为 0,因为它只是 1。我想我现在明白了。 非常感谢您的回答! 困惑来自 w3schools,其中写着“splice() 方法在数组中添加/删除项目,并返回删除的项目。” - 他们没有说,返回的项目变成了一个数组。关于对象数组 - 这是正确的制作方法,还是有更有用的方法?
  • @Juls 我通常尽量远离 w3schools javascript 参考。它通常含糊不清和/或具有误导性。您的理解似乎是正确的,只要您确实需要从数组中删除项目,splice 就是完成这项工作的完美工具
猜你喜欢
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多