2012-12-20 55 views
2

我有一個返回我的對象​​,看起來大致是一個Ajax請求如下:在Javascript中創建多維數組索引?

[ 
{category: "Test Category", id: "1", name: "Test", language: "English"}, 
{category: "Test Category", id: "2", name: "Test2", language: "English"}, 
{category: "A test",  id: "3", name: "Test3", language: "Spanish"}, 
{category: "Test Category", id: "4", name: "Test4", language: "Spanish"} 
] 

基本上我需要一種方法來做到以下幾點:

  • 列表中存在的所有類別ONLY英語或西班牙語
  • 列出所有的ID存在於指定語言的
  • 列出所有的ID存在於指定類別

現在我相當確定做這件事的最佳途徑是創建我自己的臨時數組,可以容納這些數據,但我沒有足夠的信心在Javascript中編寫正確的循環來獲取數據。我知道在PHP中,我會在循環時做類似$category['Test Category'][] = 3的操作。

這個想法是我需要的能力來篩選的東西的基礎上,用戶選擇過濾英語,然後在其中的類別。

有人能指出我正確的方向嗎?

+2

這聽起來像一個大量的工作。相反,請使用underscore.js - http://underscorejs.org/。您可以使用過濾器,採摘,地圖等。 –

+0

你可以像在PHP中那樣做,除了'$ arr [] = $ x'是'arr.push(x)' –

+0

別忘了'arr = arr || []'如果它不存在,將創建一個新數組。 –

回答

3

使用下劃線爲您的任務的一些方法: http://underscorejs.org

var data = [ 
{category: "Test Category", id: "1", name: "Test", language: "English"}, 
{category: "Test Category", id: "2", name: "Test2", language: "English"}, 
{category: "A test",  id: "3", name: "Test3", language: "Spanish"}, 
{category: "Test Category", id: "4", name: "Test4", language: "Spanish"} 
] 

// Filter by spanish 
var output = _.where(data, {"language":"Spanish"}); 

// Filter by category 
var output = _.where(data, {"category":"A test"}); 

// List specific category ids 
var output = _.pluck(_.where(data, {"category":"A test"}), "id"); 

// List category names 
var output = _.pluck(_.where(data, {"language":"English"}), "category"); 

// Group by languages 
var output = _.groupBy(data, function(value) { 
    return value.language 
}); 
output["English"]; 
+0

誰,你是誰;約會代理?因爲你讓我愛上'underscore.js' ;-) –

+0

我會扁平地圖你的心! –

+0

不,不,我同意1月我可以使用:) – Peter

2

既然你在標籤中包括jQuery的,我想我會用它:

//All categories with English or spanish language (categories is the array) 
$.grep(categories, function(c) { return c.language=='English' || c.language == 'Spanish'; }); 
-1

神奇的谷歌而言是「地圖」和「減少」。

var data = [...the JSON data parsed with JSON.parse() if necessary...] 

var categoriesInEnglish = data.reduce(function(accumulator, category) { 
    if(category.language = 'English') { 
     accumulator.push(category.id); 
    } 
}); 

看到http://www.mrspeaker.net/2011/05/02/conventional-interfaces/http://www.mrspeaker.net/2011/04/27/reducing-map/

+0

第一次調用時,「accumulator」是什麼?我懷疑這是一個空陣列。 –

+0

這是一系列的答案。如果你想要達到最終兼容性,jQuery的$ .map()和$ .grep()可能會更簡單。 – robrich

+0

這不起作用。當第一次調用回調函數時,它的第一個參數是數組的第一個元素。另外,在每次後續的調用中,'accumulator'都是'undefined',並拋出一個TypeError。 –

0

如果你能在有關數據始終是真實的幾個假設計算 - 如,你將只有類別:,id :, name :,和language :,並且在名稱或類別的任何地方都不會有冒號或逗號 - 那麼我實際上會建議將所有的信息int o單個字符串並使用RegExp查找它。

如:

[ 
"category:Test Category, id:1, name:Test, language:English", 
"category:Test Category, id:2, name:Test2, language:English", 
"category:A test,  id:3, name:Test3, language:Spanish", 
"category:Test Category, id:4, name:Test4, language:Spanish" 
] 

現在,找到一個條目的值,用RegExp.match()。

var m = /^category:([^,]+)\s+id:(\d+),\s+name:([^,]+),\s+language:(.+)$/i; 
// m[1] = Test Category 
// m[2] = 1; 
// m[3] = Test2 
// m[4] = Spanish 

而且您可以使用測試進行搜索。

function my_filter(criteria) { 
    var results = []; 
    var re = new RegExp(criteria); 
    for (var i=0; i<array.length; i++) { 
     if (array[i].test(re)) 
      results.push(array[i]); 
    } 
    return results; 
} 
var english_array = my_filter('language:english'); 
var atest_array = my_filter('category:a test'); 
+0

你能解釋一下你提出這個解決方案的邏輯嗎?這是不同的,我對好處感到好奇。 –

+0

正則表達式解析在瀏覽器中是強大的,更重要的是...... _native_,所以它可能比複雜的JavaScript解析速度快得多。如果需要,只需通過更改正則表達式即可輕鬆匹配多個條件。每當我處理相對簡單的數據時,我發現使用字符串本地工作會更容易,更快速。 –

1

使用香草JS,其中json是你原來的數組,你可以使用:

function filterJson(attr, obj) { 
    var attrList = [], 
     match, 
     tempAttr, 
     i; 

    for (i = 0; i < json.length; i += 1) { 
     match = true; 

     for (tempAttr in obj) { 
      if (!obj[tempAttr].test(json[i][tempAttr])) { 
       match = false; 
       break; 
      } 
     } 

     if (match) attrList.push(json[i][attr]); 
    } 

    return attrList; 
} 

而且使用這樣的:

「列出所有類別僅存英語或西班牙語「

filterJson('category', { 
    language: /(English|Spanish)/ 
}); 
// => ["Test Category", "Test Category", "A test", "Test Category"] 

「列出所有的ID存在於特定的語言」

filterJson('id', { 
    language: /English/ 
}); 
// => ["1", "2"] 

「列出所有的ID存在於特定類別」

filterJson('id', { 
    category: /Test Category/ 
}); 
// => ["1", "2", "4"]