这里我得到了一个对象文字,如下所示:
var assets = {
images: {
'sky': 'assets/sky.png',
'platform': 'assets/platform.png'
},
spritesheets: {
'dude': 'assets/dude.png'
}
}
我的目标是创建一个可以调用不同函数的函数,具体取决于这些资产的类型。
我在考虑这种解决方案:
function preload() {
for (var asset in assets) {
switch ( /* check the asset's type */ ) {
case 'images':
// do something
break;
case 'spritesheets':
// do something
break;
}
}
}
我该如何实施?
很抱歉我使用英语很差,因为我不是母语人士。 ; d
答案 0 :(得分:1)
Javascript的for...in
功能循环遍历对象的属性(或键),而不是值。所以你可以这样做:
function preload() {
for (var asset in assets) {
switch (asset) {
case 'images':
for (var image in assets[asset]) {
// assets[asset][image] will be an image url
}
break;
case 'spritesheets':
for (var spritesheet in assets[asset]) {
// assets[asset][spritesheet] will be an spritesheet url
}
break;
}
}
}
答案 1 :(得分:1)
我有点困惑为什么你甚至想要一个循环,似乎没有任何需要。如果您使用的是开关,则表示您知道所调用的预期属性是什么,所以为什么不直接访问它们。例如:
// Do something with assets.images
// Do something different with assets.spritesheets
如果您担心不知道是否已指定,请先检查:
if(assets.images){
// Do something with assets.images
}
if(assets.spritesheets){
// Do something different with assets.spritesheets
}
答案 2 :(得分:0)
asset
会回复此名称。
因此你可以这样做:
switch (asset) {
然而,如果你能以不同的方式构建你的对象会更清晰:
var assets = [
{
name: "images",
files: [
{
key: "sky",
path: "assets/sky.png"
},
{
key: "platform",
path: "assets/platform.png"
}
]
},
{
name: "spritesheets",
files: [
{
key: "dude",
path: "assets/dude.png"
}
]
}
];
答案 3 :(得分:0)
您可以在asset
语句中使用switch
,因为JavaScript中的for..in
循环将循环遍历任何可枚举属性(默认情况下对象文字的所有属性)。
function preload(assets) {
for (var asset in assets) {
switch (asset) {
case 'images':
// do something
break;
case 'spritesheets':
// do something
break;
}
}
}
如果您询问如何以不同的方式枚举对象的属性(键),那么一种方法是使用Object.keys()
来获取用于迭代的键名数组。
function preload(assets) {
Object.keys(assets).forEach(function (asset) {
switch (asset) {
case 'images':
// do something
break;
case 'spritesheets':
// do something
break;
}
});
}
答案 4 :(得分:0)
回答您的问题"我应该如何实施?" (而不是关于如何检查对象文字名称的标题问题)......
您可以创建一个对象,将每个switch
映射到您要为其调用的函数,而不是使用asset
语句,然后在preload
函数中调用该映射对象上的函数。
该对象看起来像这样:
var fnByAsset = {
images: function () { /* ... */ },
spritesheets: function () { /* ... */ }
};
(如果多个asset
共享相同的功能,当然,您将功能定义移到对象之外,只是从对象引用它们。)
然后您的preload
函数将如下所示:
function preload() {
Object.keys(assets).forEach(function (asset) {
fnByAsset[asset]();
});
}
我希望尽可能在switch
语句之上使用这种功能更强大的方法。对我来说感觉更干净,并且随着您添加更多项目(asset
在您的情况下),往往更易于维护和扩展。