2015-07-21 86 views
1

在這裏,我得到了一個文本對象,看起來像下面這樣:如何在JavaScript中檢查對象文字的名稱?

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

你的英語很好。 –

+0

您可能想檢查*屬性*名稱。對象文字沒有名字(也許'資產'將有資格,但這是一個變量名稱,不可取) – Bergi

+0

我終於找到了一個類似於@IsaacLyman解決方案的解決方案。感謝這裏的每個人,爲您提供詳細而巧妙的解決方; D –

回答

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

感謝您對物體結構的精巧建議! –

0

您可以在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; 
    } 
    }); 
} 
+0

哇,你的第二個方法(枚舉對象的屬性)是一個超級聰明的技巧!謝謝你的幫助! –

+0

@YummySushi:我不是說它是或者不是,但你爲什麼認爲這是一個「超級聰明的技巧」?是因爲它看起來比每個循環的簡單更復雜? – musefan

0

迴應您的問題「我該如何實施它?」 (而不是關於如何檢查對象文字的名稱的標題問題)...

而不是使用switch語句,您可以創建一個對象,將每個asset映射到您要爲其調用的函數,然後,在你的preload函數中,只需調用該映射對象上的函數即可。

這對象將是這個樣子:

var fnByAsset = { 
    images: function() { /* ... */ }, 
    spritesheets: function() { /* ... */ } 
}; 

(如果有多個asset份額相同的功能,當然,你會移動的函數定義之外的對象,並從對象只是引用它們。)

而且你preload功能則是這樣的:

function preload() { 
    Object.keys(assets).forEach(function (asset) { 
    fnByAsset[asset](); 
    }); 
} 

我喜歡這個功能更強大Appro公司儘可能在switch聲明。它讓我感覺更清潔,並且隨着您添加更多項目(您的案例中的asset s)往往更易於維護和擴展。

+0

謝謝你的解決方案。它激勵了我很多。 :-D –

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 
}