Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用2 JSON筛选结果_Javascript_Jquery_Json - Fatal编程技术网

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
,return
false
在当前迭代中打破循环。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);