【问题标题】:Creating a new object from another and reading it from an array. (Javascript)从另一个对象创建一个新对象并从数组中读取它。 (Javascript)
【发布时间】:2014-01-31 09:02:04
【问题描述】:

我有以下示例构造函数:

function Loot(type, sellValue) {
    this.type = type;
    this.sellValue = sellValue; 
}

我希望将这些值继承到其他对象中,然后将其推入数组中,例如:

var inventory = [];

var stone = new Loot("craft", 20);
inventory.push(stone);

var hat = new Loot("clothing", 80);
inventory.push(hat);

var coal = new Loot("ore", 5);
inventory.push(coal);

var diamond = new Loot("ore", 400);
inventory.push(diamond);


console.log(inventory);

但是,当我这样做时,我的库存显示为 (Loot, Loot, Loot, Loot),而不是物品的名称 (stone, hat, coal, diamond)

我该如何解决这个问题?我想它需要某种形式的继承?

谢谢!

【问题讨论】:

  • 你是什么意思,“库存读作 (Loot, Loot, Loot, Loot)”?你如何输出它?而你展示的只有一个项目?
  • @Bergi 说我已将多个“石头”推入数组和 console.log(inventory),它返回 [Loot, Loot, Loot, ...]。我已经编辑了问题以更好地解决它,谢谢!
  • 如果你用过console.log,那么Loot只是告诉你这个对象是由Loot函数构造的。单击它以展开它并显示属性。当您想要的是数组时,请不要使用已接受答案中建议的对象。
  • @Bergi 我已经进一步更新了这个问题。如果不是以前接受的答案,那么解决此问题的最佳方法是什么?
  • 现在这是一个非常不同的问题。但是除非逻辑上必要,否则应该避免类层次结构。将另一个属性添加到您的 Loot 类(如类别)会更容易。

标签: javascript arrays object inheritance


【解决方案1】:

像石头这样的变量名对对象没有任何意义。它们是对您的对象的引用,但不是对象的数据。

所以石头只是创建的同一个新战利品的变量名称。

您的示例中只有一个 Loot 对象。

此外,如果您使用调试器查看数组,我将显示对象的类型(战利品)。您需要展开它以查看对象内的值。

【讨论】:

  • 如果我希望它在使用 console.log 时在清单中显示为“石头”,我需要做什么?我假设有必要进行某种程度的扩展或继承?
【解决方案2】:

但是,当我这样做时,我的库存显示为 (Loot, Loot, Loot, Loot),而不是物品的名称 (stone, hat, coal, diamond)

您需要迭代您的 inventory 数组并记录所有项目的 .type 属性:

for (var i=0; i<inventory.length; i++)
    console.log(inventory[i].type);

或者您可以从项目类型构建另一个数组,这可以通过map method 轻松完成:

var types = inventory.map(function(item) { return item.type; });
console.log(types);

【讨论】:

  • 那么你会说最好在战利品中添加一个名为“name”的属性,然后根据我传入的内容添加“stone”、“hat”等吗?库存是否将它们全部读取为“战利品”理想而不是我应该尝试替换的东西?感谢您的所有帮助!
  • 是的,你需要另一个字符串属性name;因为@RickLove 已经写了您的 variable 名称没有意义,并且不能以编程方式访问。同样是的,console.log 显示 Loot 没有任何问题 - 点击它查看对象!对于程序中的任何实际使用(或屏幕上的输出),您无论如何都要迭代数组。此外,对于调试,您可以尝试console.log(JSON.stringify(inventory)) :-)
【解决方案3】:

数组不能有字符串键。 显然你需要使用一个对象来存储这些对象。

function Loot(type, sellValue){
  this.type = type;
  this.sellValue = sellValue; 
}

var inventory = {};
var inventory2 = {};

var stone = new Loot("craft", 20);
var stone1 = new Loot("craft1", 30);
var stone2 = new Loot("craft2", 40);

//or as follows: 
inventory2['stone'] = stone;
inventory2['stone1'] = stone1;
inventory2['stone2'] = stone2;

console.log(inventory);   // Object {craft: Loot, craft1: Loot, craft2: Loot}
console.log(inventory2);  // Object {stone: Loot, stone1: Loot, stone2: Loot}

http://jsbin.com/aNiXolo/5/edit

【讨论】:

  • 有趣。我觉得我懂了。感谢您的帮助!
  • OP 在哪里使用了数组上的字符串键?
  • 这不是一个数组。它是一个具有多个命名属性的对象,由索引器 [] 表示法而不是 .点符号。
猜你喜欢
  • 1970-01-01
  • 2021-06-15
  • 2021-03-30
  • 2021-07-03
  • 1970-01-01
  • 1970-01-01
  • 2019-07-04
  • 2021-06-07
  • 1970-01-01
相关资源
最近更新 更多