使用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>');
});
由于
答案 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。