2

我有一个 ajax 请求,它返回给我一个大致如下所示的对象:

[
 {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"}
]

基本上我需要一种方法来执行以下操作:

  • 列出仅以英语或西班牙语存在的所有类别
  • 列出以指定语言存在的所有 ID
  • 列出指定类别中存在的所有 ID

现在我相当确定最好的方法是创建我自己的临时数组来存储这些数据,但我对 Javascript 没有足够的信心编写正确的循环来获取这些数据。我知道在 PHP 中我会做类似$category['Test Category'][] = 3while 循环的事情。

我的想法是我需要能够根据用户选择按英语过滤然后按其中的类别过滤事物。

有人可以指出我正确的方向吗?

4

5 回答 5

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"];
于 2012-12-20T21:56:33.713 回答
2

既然你在标签中包含了 jQuery,我想我会使用它:

//All categories with English or spanish language (categories is the array)
$.grep(categories, function(c) { return c.language=='English' || c.language == 'Spanish'; });
于 2012-12-20T21:51:54.850 回答
1

使用 vanilla 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"] 
于 2012-12-20T22:09:37.527 回答
0

如果您可以依靠一些关于数据始终为真的假设——例如,您将永远只有类别:、id:、名称:和语言:,并且在任何地方都不会有冒号或逗号名称或类别——那么我实际上建议将所有信息粘贴到单个字符串中并使用 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');
于 2012-12-20T22:01:59.257 回答
-1

神奇的 Google 术语是“map”和“reduce”。

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/

于 2012-12-20T21:53:22.157 回答