2017-06-22 58 views
0

这可能是一个JS问题,我不确定。JSON命名对象与名称属性的数组

我正在使用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 
    } 
    } 
} 

我想知道我是否应该使用敌人的数组,与"name"属性,而不是每一个区域来代替。像这样:

{ 
    "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数组中的函数,日期和未定义。 –

+0

我同意*“iterator”*声明,但除非问题实际上可以用“在您的上下文中的实际用法”来表达,否则它实际上只是基于意见。虽然我确实相信命名的键是“反模式”。国际海事组织是。 –

+0

你可以走一步,并创建一个区域对象数组: '[{areaName:'Area 1',敌人:[{name:'enemy 1',type:'human'},{name:'enemy 2 ',键入:'human'}]},{},{}]' –

回答

0

第二个选项感觉很好。它的结构合理,你可以轻松地通过任何区域循环执行对敌人的选项。我的建议是与第二个一起去。

var Map = [ 
    Area1: [ 
    { 
     name: "Enemy 1"; 
     metaData: '...' 
    }, 
    { 
     name: "Enemy 2"; 
     metaData: '...' 
    } 
    ], 
    Area2: [ 
    { 
     name: "Enemy 1"; 
     metaData: '...' 
    } 
    ] 
]; 

扫描特定区域内的敌人。

Map[Area1].forEach(function(enemy) { 
    //Operation ... 
}); 

我希望这会有所帮助。 :)