算不了。具有多个键中的特定值的json对象中的条目

时间:2015-10-08 19:35:47

标签: javascript json

有没有办法从json对象获取/搜索数据,类似于使用javascript触发查询?

我的场景:我有一个很大的json对象(如果你把它想象成一个数据库,它有12列,1000行)。我需要知道有多少行有一个特定的值对(即行数,第1列的'USA'和第2列的'INDIA')。

例如。(例如,我创建了一个小例子json对象)

json对象:

{"export":
   [{"goods":"Wheat ", "from":"GHANA", "to":"AUSTRALIA"},    
    {"goods":"Wheat", "from":"USA", "to":"INDIA"},    
    {"goods":"Wheat", "from":"SINGAPORE", "to":"MALAYSIA"},    
    {"goods":"Wheat", "from":"USA", "to":"INDIA"},    
]}

在这个例子中,因为有两行来自USA,而且是INDIA。

可以认为它类似于mysql查询:

select * from export where from = "USA" and to = "INDIA";

我可以使用javascript在json对象上执行此操作吗?

如果没有,可以从csv文件做类似的事情,我也有该数据的csv文件?

5 个答案:

答案 0 :(得分:1)

是的,只需过滤数组即可获得符合查询要求的元素,并计算剩下的长度。这是可重复使用的功能形式的代码

function counter(f, t) {
  return json.export.filter(function(elem) {
    return elem.from===f && elem.to===t;
  }).length;
}

答案 1 :(得分:0)

您可以使用 filter() length 属性。 filter() 会根据我们的条件过滤数组,以便使用 length 属性来获取数组计数。

var data = {
  "export": [{
    "goods": "Wheat ",
    "from": "GHANA",
    "to": "AUSTRALIA"
  }, {
    "goods": "Wheat",
    "from": "USA",
    "to": "INDIA"
  }, {
    "goods": "Wheat",
    "from": "SINGAPORE",
    "to": "MALAYSIA"
  }, {
    "goods": "Wheat",
    "from": "USA",
    "to": "INDIA"
  }, ]
};

var count = data.export.filter(function( v) {
  return v.from == 'USA' && v.to == 'INDIA'
}).length;

alert(count);

答案 2 :(得分:0)

您可以使用过滤器对符合多个条件的表达式进行编码:

o.export.filter(function(a){return a.from=="USA" && a.to=="INDIA"}).length

我喜欢可重复使用的过滤器回调,这可以让您在通话时更改条件而不是代码时间:

function match(x){ return x[this[0]]===this[1]; }
//usage:
o.export.filter(match,["from", "USA"]).filter(match, ["to","INDIA"]).length;

可重复使用的列允许您设置不同的列并比较值而无需重写函数。

答案 3 :(得分:0)

这应该有效:

var a = {"export":
   [{"goods":"Wheat ", "from":"GHANA", "to":"AUSTRALIA"},    
    {"goods":"Wheat", "from":"USA", "to":"INDIA"},    
    {"goods":"Wheat", "from":"SINGAPORE", "to":"MALAYSIA"},    
    {"goods":"Wheat", "from":"USA", "to":"INDIA"},    
]};

var b = 0;

for(var i = 0; i < a.export.length; i++){
  if( a.export[i].from == 'USA' && a.export[i].to == 'INDIA'){
    b++;
  }
}

答案 4 :(得分:0)

这是结构化数据的结构化查询的更详细示例,其中包括对结果数组进行排序的奖励。

它具有一个带有三个参数的小函数select(from, where, sort)

  • 来自:数据源为数组,必需。

  • 其中:具有一个或多个键/值对的对象,如果提供了多个键,则条件为链接。如果是假的,则省略该参数。

  • sort :具有键/值对对象的数组,该对象使用值以1递增的键对结果集进行排序,以值-1递减。排序具有字符串排序。如果是假的,则省略该参数。

测试用例返回:

  1. 使用from = 'USA'to = 'INDIA'计算所有集合。
  2. 所有设置为from = 'USA'to = 'INDIA',未排序。
  3. from升序排序的所有集合。
  4. &#13;
    &#13;
    var data = {
            "export": [
                { "goods": "Wheat ", "from": "GHANA", "to": "AUSTRALIA" },
                { "goods": "Wheat", "from": "USA", "to": "INDIA" },
                { "goods": "Wheat", "from": "SINGAPORE", "to": "MALAYSIA" },
                { "goods": "Wheat", "from": "USA", "to": "INDIA" }
            ]
        };
    
    function select(from, where, sort) {
        var data = from.slice(0);
        where && Object.keys(where).forEach(function (k) {
            data = data.filter(function (d) {
                return d[k] === where[k];
            });
        });
        sort && data.sort(function (a, b) {
            var value = 0;
            sort.some(function (el) {
                var key = Object.keys(el)[0];
                value = ~el[key] ? a[key].localeCompare(b[key]) : b[key].localeCompare(a[key]);
                return value;
            });
            return value;
        });
        return data;
    }
    
    function print(o) {
        document.body.innerHTML += '<pre>' + JSON.stringify(o, 0, 4) + '</pre>';
    }
    
    print(select(data.export, { from: 'USA', to: 'INDIA' }).length);
    print(select(data.export, { from: 'USA', to: 'INDIA' }));
    print(select(data.export, {}, [{ from: 1 }]));
    &#13;
    &#13;
    &#13;