有没有办法从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文件?
答案 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递减。排序具有字符串排序。如果是假的,则省略该参数。
测试用例返回:
from = 'USA'
和to = 'INDIA'
计算所有集合。from = 'USA'
和to = 'INDIA'
,未排序。from
升序排序的所有集合。
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;