如何在JavaScript中检查对象文字的名称?

时间:2015-07-21 15:30:54

标签: javascript object-literal

这里我得到了一个对象文字,如下所示:

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

5 个答案:

答案 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) {

http://jsfiddle.net/1tekLw5h/

然而,如果你能以不同的方式构建你的对象会更清晰:

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在您的情况下),往往更易于维护和扩展。