Javascript 使用2 JSON筛选结果
这是我保存的本地存储Javascript 使用2 JSON筛选结果,javascript,jquery,json,Javascript,Jquery,Json,这是我保存的本地存储 [{"industry_Id":1,"merchant_id":2}] 我想过滤下面的结果,以获得HP { "industries": [ { "id": 1, "name": "oil and gas", "merchant": [ { "id": 1, "name
[{"industry_Id":1,"merchant_id":2}]
我想过滤下面的结果,以获得HP
{
"industries": [
{
"id": 1,
"name": "oil and gas",
"merchant": [
{
"id": 1,
"name": "ABC",
},
{
"id": 2,
"name": "DEF",
},
{
"id": 3,
"name": "GHJ",
}
]
},
{
"id": 2,
"name": "IT",
"merchant": [
{
"id": 1,
"name": "Apple",
},
{
"id": 2,
"name": "HP",
},
{
"id": 3,
"name": "Google",
}
]
}
]
}
我曾想过使用多个$。每个$,但它必须迭代几次,这是非常冗余的
selectors.map(function(selector) {
return data.industries.filter(function(industry) {
return industry.id == selector.industry_Id;
})[0].merchant.filter(function(merchant) {
return merchant.id == selector.merchant_id;
})[0].name;
});
// => DEF
如果你想要“HP”,你需要的是行业2,而不是行业1
.filter(…)[0]
并不是真正的最佳选择。您可以使用.find(…)
,但这还没有得到普遍支持。或者,您可以使用普通的旧JavaScript并编写for循环来加快速度。或者,您可以使用带有ID键的对象而不是数组来加快查找速度。我更喜欢使用Javascript进行循环,这样您可以在找到所需元素后跳过对每个对象的迭代
不带jQuery(使用for
)
var arg=[{“行业Id”:1,“商户Id”:2}];
风险值数据={
“工业”:[
{
“id”:1,
“名称”:“石油和天然气”,
“商人”:[
{
“id”:1,
“名称”:“ABC”,
},
{
“id”:2,
“名称”:“定义”,
},
{
“id”:3,
“名称”:“GHJ”,
}
]
},
{
“id”:2,
“名称”:“它”,
“商人”:[
{
“id”:1,
“名称”:“苹果”,
},
{
“id”:2,
“名称”:“HP”,
},
{
“id”:3,
“名称”:“谷歌”,
}
]
}
]
};
风险值i,j,商户=null;
对于(i=0;i”;
document.writeln((商户!==null)?“已找到”+商户['name']:“未找到”);
var\u found=null;
美元。每个(数据[‘行业’],功能(i,行业){
if(行业['id']==arg[0]['industry\u id']){
美元,每个(行业[‘商户]),职能(一,商户){
如果(商户['id']==arg[0]['商户id']){
商户_found=商户;
}
返回(!找到商户);
});
}
返回(!找到商户);
});
控制台日志(找到商户);
document.writeln(“
带jQuery:
”);
书面文件((找到的商户)-“找到的”+找到的商户[“名称]:“未找到”)代码>
当数据收集成为您正在处理的内容时,我建议您看看下划线.js。这并不是获得最佳性能的最佳选择,但它确实使代码更具可读性,尤其是与循环相比更有意义
假设data
是一个存储JSON数据的变量。
试试这个:
// Given this selector criteria
var select = [{"industry_Id":1,"merchant_id":2}];
function filterByCriteria(criteria, data){
var match = [];
_.each(criteria, function(crit){
function matchIndustry(rec){ return rec.id===crit.industry_Id }
function matchMerchant(rec){ return rec.id===crit.merchant_id }
// Filter by industry id
var industry = _.first(_.where(data.industry, matchIndustry));
// Filter by merchant id
var merchant = _.where(industry.merchant, matchMerchant);
_.each(merchant, function addToMatchResult(m){
match.push(m.name);
});
});
return match;
}
var filteredData = filterByCriteria(select, data);
从上面的代码片段中,任何符合搜索条件的商家都将被带到匹配列表中。您更容易阅读吗?您甚至需要数字id吗?当你不这样做的时候会变得非常容易
/*
{
“工业”:{
“石油和天然气”:{
“商人”:{
“ABC”:{
“名称”:“ABC油”
},
“DEF”:{
“名称”:“DEF气体”
},
“GHJ”:{
“名称”:“GHJ石油和天然气”
}
}
},
“它”:{
“商人”:{
“苹果”:{
“名称”:“苹果电脑”
},
“HP”:{
“名称”:“Hewlett-Packard”
},
“谷歌”:{
“名称”:“Google.Maw-haw-haw”
}
}
}
}
}
*/
var数据={“工业”:{“石油和天然气”:{“商人”:{“ABC”:{“名称”:“ABC石油”},“DEF”:{“名称”:“DEF气体”},“GHJ”:{“名称”:“GHJ石油和天然气”}}},“IT”:{“商人”:{“苹果”:{“名称”:“苹果电脑”},“惠普”{“名称”:“惠普”},“谷歌”{“名称”:“谷歌”{“谷歌.Maw-haw”}};
data=JSON.parse(数据);
var商户=数据。行业['IT']。商户['HP'];
警报(商户名称);
//控制台日志(商户名称)
我更喜欢使用$。each但是return false并不能阻止它循环,你知道为什么吗?@AaronMusktin,使用$添加了解决方案。each
,returnfalse
在当前迭代中打破循环。map()是最干净的方法,但它不是比$each更快吗?嗯,您没有说如果选择器
有更多元素,会发生什么。这就是说,map
的速度应该与的速度大致相同(只需创建一个数组作为额外开销,这应该是不可察觉的)。更大的潜在问题是filter
继续搜索其他匹配项,即使我们已经知道我们只想要第一个匹配项。嗨,亚伦。我是新来的。我也很高兴见到你。面对反对票,因为你提到裁员。我看不出行业和商家的id是不可接受的,因此我看不出为什么在db模式中内置了额外的冗余。必须对用户隐藏名称吗?如果您能够重新格式化数据库(这基本上是我的问题),那么我的示例意味着您永远不需要过滤(更多冗余),因为
var merchant_found = null;
$.each(data['industries'], function(i, industry){
if(industry['id'] == arg[0]['industry_Id']){
$.each(industry['merchant'], function(i, merchant){
if(merchant['id'] == arg[0]['merchant_id']){
merchant_found = merchant;
}
return (!merchant_found);
});
}
return (!merchant_found);
});
// Given this selector criteria
var select = [{"industry_Id":1,"merchant_id":2}];
function filterByCriteria(criteria, data){
var match = [];
_.each(criteria, function(crit){
function matchIndustry(rec){ return rec.id===crit.industry_Id }
function matchMerchant(rec){ return rec.id===crit.merchant_id }
// Filter by industry id
var industry = _.first(_.where(data.industry, matchIndustry));
// Filter by merchant id
var merchant = _.where(industry.merchant, matchMerchant);
_.each(merchant, function addToMatchResult(m){
match.push(m.name);
});
});
return match;
}
var filteredData = filterByCriteria(select, data);