如何在 JavaScript 中检查对象字面量的名称?
How Can I Check a Object Literal's Name in JavaScript?
这里我得到了一个对象文字,如下所示:
var assets = {
images: {
'sky': 'assets/sky.png',
'platform': 'assets/platform.png'
},
spritesheets: {
'dude': 'assets/dude.png'
}
}
而我的 objective 是创建一个函数,它可以根据这些资产的类型调用不同的函数。
我想到了这样的解决方案:
function preload() {
for (var asset in assets) {
switch ( /* check the asset's type */ ) {
case 'images':
// do something
break;
case 'spritesheets':
// do something
break;
}
}
}
我该如何实施?
抱歉我的英语不好,因为我不是母语人士。 ;D
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"
}
]
}
];
Javascript 的 for...in
功能循环对象的 properties(或 keys),不是 值 。所以你可以这样做:
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;
}
}
}
您可以在 switch
语句中使用 asset
,因为 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;
}
});
}
回答你的问题"How should I implement it?"(不是关于如何检查object文字名称的标题问题)...
而不是使用 switch
语句,您可以创建一个 object 将每个 asset
映射到您要为其调用的函数,然后,在您的 preload
函数,只需调用该映射上的函数 object.
object 看起来像这样:
var fnByAsset = {
images: function () { /* ... */ },
spritesheets: function () { /* ... */ }
};
(如果多个 asset
共享同一个函数,当然,您可以将函数定义移到 object 之外,并从 object 中引用它们。)
然后您的 preload
函数将如下所示:
function preload() {
Object.keys(assets).forEach(function (asset) {
fnByAsset[asset]();
});
}
我更喜欢这种比 switch
语句更实用的方法。它对我来说感觉更干净,并且随着您添加更多项目(asset
s 在您的情况下)往往更易于维护和扩展。
我有点困惑为什么你甚至想要一个循环,似乎没有任何需要。如果您使用的是开关,则意味着您知道调用的预期属性是什么,那么为什么不直接访问它们呢。例如:
// 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
}
这里我得到了一个对象文字,如下所示:
var assets = {
images: {
'sky': 'assets/sky.png',
'platform': 'assets/platform.png'
},
spritesheets: {
'dude': 'assets/dude.png'
}
}
而我的 objective 是创建一个函数,它可以根据这些资产的类型调用不同的函数。
我想到了这样的解决方案:
function preload() {
for (var asset in assets) {
switch ( /* check the asset's type */ ) {
case 'images':
// do something
break;
case 'spritesheets':
// do something
break;
}
}
}
我该如何实施?
抱歉我的英语不好,因为我不是母语人士。 ;D
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"
}
]
}
];
Javascript 的 for...in
功能循环对象的 properties(或 keys),不是 值 。所以你可以这样做:
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;
}
}
}
您可以在 switch
语句中使用 asset
,因为 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;
}
});
}
回答你的问题"How should I implement it?"(不是关于如何检查object文字名称的标题问题)...
而不是使用 switch
语句,您可以创建一个 object 将每个 asset
映射到您要为其调用的函数,然后,在您的 preload
函数,只需调用该映射上的函数 object.
object 看起来像这样:
var fnByAsset = {
images: function () { /* ... */ },
spritesheets: function () { /* ... */ }
};
(如果多个 asset
共享同一个函数,当然,您可以将函数定义移到 object 之外,并从 object 中引用它们。)
然后您的 preload
函数将如下所示:
function preload() {
Object.keys(assets).forEach(function (asset) {
fnByAsset[asset]();
});
}
我更喜欢这种比 switch
语句更实用的方法。它对我来说感觉更干净,并且随着您添加更多项目(asset
s 在您的情况下)往往更易于维护和扩展。
我有点困惑为什么你甚至想要一个循环,似乎没有任何需要。如果您使用的是开关,则意味着您知道调用的预期属性是什么,那么为什么不直接访问它们呢。例如:
// 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
}