JSON命名对象 vs 带有名称属性的数组

4
可能是一个JS问题,我不确定。
我正在使用JSON来存储游戏中有关敌人的数据。我目前的结构如下:
{
  "Area 1": {
    "Enemy Name": {
      "type": "Human",
      "lvl": 30
    },
    "Enemy 2": {
      "type": "Human",
      "lvl": 30
    }
  },
  "Area 2": {
    "Enemy 1": {
      "type": "Human",
      "lvl": 30
    },
    "Enemy 2": {
      "type": "Human",
      "lvl": 30
    }
  }
}

我在思考是否应该改用每个区域的敌人数组,并使用一个具有“名称”属性的数组。像这样:

{
  "Area 1": [
    {
      "name": "Enemy Name",
      "type": "Human",
      "lvl": 10
    },
    {
      "name": "Enemy 2",
      "type": "Human",
      "lvl": 30
    }
  ],
  "Area 2": [
    {
      "name": "Enemy 1",
      "type": "Human",
      "lvl": 30
    },
    {
      "name": "Enemy 2",
      "type": "Human",
      "lvl": 30
    }
  ]
}

我认为第二种方法是我应该采用的方式,但我想听听其他人的反馈。我认为使用第一种方法,我需要知道敌人的名称才能读取它们的数据,而使用数组,我可以遍历各个区域并读取每个区域中的敌人数据。 提前感谢任何帮助!


1
我认为使用第二种方式,你将能够更方便地操作你的数据,因为它是以数组形式存在的。为什么这是一个优势呢?因为数组默认是可迭代的,而对象则不是(但你可以使它们可迭代)。但请记住,在JSON数组中,你将无法使用函数、日期和未定义的值。 - Ilya Kushlianski
我同意"迭代器"这个声明,但除非问题实际上可以用"您的上下文中的实际用法"来表达,否则它只是基于观点。不过,我认为命名键是一种"反模式"。在我看来是这样的。 - Neil Lunn
1
你可以更进一步,创建一个区域对象的数组: [{areaName:'区域1',enemies:[{name:'敌人1',type:'人类'},{name:'敌人2', type:'人类'}]}, {}, {} ] - Kaushal Niraula
@KaushalNiraula 这也是我刚想到的。这将使实现和扩展变得最容易。 - themadjem
1个回答

1
第二个选项感觉更合适。它被正确构造,您可以轻松循环遍历任何区域来对敌人执行操作。我的建议是选择第二个选项。
var Map = [
  Area1: [
    {
      name: "Enemy 1";
      metaData: '...'
    },
    {
      name: "Enemy 2";
      metaData: '...'
    }
  ],
  Area2: [
    {
      name: "Enemy 1";
      metaData: '...'
    }
  ]
];

在特定区域扫描敌人。
Map[Area1].forEach(function(enemy) {
  //Operation ...
});

我希望这有所帮助。 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接