在JSON对象值中查询JSON数组的问题

时间:2014-04-02 23:14:02

标签: javascript jquery json

使用jsonSelect插件我正在尝试执行查询,如下所示。你能否看看This example,让我知道如何检索所有项目承包商谁拥有项目" North&# 34; ProjectArea?我已经尝试过这个以获得承包商的名字,但它没有工作

var contractors = [{
    "contractor1": [{
                     "project": "Project 2",
                     "projectArea": "South"
                    },
                    {
                     "project": "Project 101",
                     "projectArea": "East"
                    }],
     "contractor2": [{
                     "project": "Project 500",
                     "projectArea": "North"
                     },  
                     {
                     "project": "Projetc 108",
                     "projectArea": "West"
                    }]
}]

var stringSelect = 'has(:root > .projectArea:val("North"))';
JSONSelect.forEach(stringSelect, contractors, function (resultObj) {
    $('body').append('<p>' + resultObj + '</p>');
});

由于

1 个答案:

答案 0 :(得分:2)

我认为,通过更改JSON数据结构,您能够实现目标的唯一方法就是。具体来说,您将承包商的名称作为密钥('contractor1',contractor2'),但它们确实应该是值。您正在使用的库返回一组对象,但我没有看到任何方法退回一个级别并获取每个对象的相应键。我建议像这样构建你的数据:

var contractors = [
    {
        "name": "contractor1",
        "projects": [
            { "project": "Project 2", "projectArea": "South" },
            { "project": "Project 101", "projectArea": "North" }
        ]
    },
    {
        "name": "contractor2", 
        "projects": [
            { "project": "Project 500", "projectArea": "North" },
            { "project": "Project 108", "projectArea": "West" }
         ]
    }
];

此外,我认为您必须应用两级过滤器,首先是为了获得承包商,其次是为了获得每个承包商的项目:

JSONSelect.forEach('object:has(.projects:has(.projectArea:val("North")))', contractors, function (contractor) {
    $('body').append('<p>' + contractor.name + '</p>');
    JSONSelect.forEach('object:has(.projectArea:val("North"))', contractor.projects, function (project) {
        $('body').append('<p>' + project.project + '</p>'); 
    });
});

我不知道有任何其他插件可以做到这一点。如果我遇到这个问题,我的第一个倾向是使用jQuery的$ .map和$ .grep方法来解决它:

var filtered = $.map(contractors, function (contractor) {
    var filteredProjects = $.grep(contractor.projects, function (project) {
        return project['projectArea'] === 'North';
    });
    if (filteredProjects.length) {
        return { 
            'name': contractor.name, 
            'projects': filteredProjects
        };
    }
});

我使用$ .grep将每个承包商的项目过滤到只有['projectArea'] === 'North'的项目。如果承包商有任何与过滤器匹配的项目,则具有承包商名称和过滤项目的新对象将添加到我的filtered var。