如何在 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) {

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"
       }
    ]
  }
];

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 语句更实用的方法。它对我来说感觉更干净,并且随着您添加更多项目(assets 在您的情况下)往往更易于维护和扩展。

我有点困惑为什么你甚至想要一个循环,似乎没有任何需要。如果您使用的是开关,则意味着您知道调用的预期属性是什么,那么为什么不直接访问它们呢。例如:

// 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
}