我有一个非常大的Json文件(数据集大于30 000)。我需要检查某个键的某个部分值是否与给定的字符串相同,然后增加一个int。
这是Json的一部分:
[
{
"geo": null,
"coordinates": null,
"in_reply_to_status_id_str": null,
"contributors": null,
"in_reply_to_user_id": null,
"in_reply_to_status_id": null,
"truncated": false,
"created_at": "Tue Nov 13 20:17:17 +0000 2012"
我想检查“created_at”键是否有某一天(值)。例如'Tue'
然后递增:var tuesday = 0;
我唯一想到的就是这个功能:
function getValues(obj, key) {
var objects = [];
for (var i in obj) {
if (!obj.hasOwnProperty(i)) continue;
if (typeof obj[i] == 'object') {
objects = objects.concat(getValues(obj[i], key));
} else if (i == key) {
objects.push(obj[i]);
}
}
return objects;
}
但它只检查密钥并将值放入数组中。那不是我想要的。
答案 0 :(得分:3)
从您的问题中不能立即清楚数据的结构是什么,但它看起来是一个对象数组,其中created_at属性将使用Date填充。如果您需要它是递归的(您提供的代码建议),则需要修改以下代码。但是要说明一下:
我想检查“created_at”键是否有某一天(值)。喜欢 例如'Tue'然后递增:var tuesday = 0;
然后,以下内容将数组作为data
并导致变量value
包含一个带有天数映射的对象和created_at
属性开头的项目数一周7天的字符串。
var valMap = {
Sun: 'sunday',
Mon: 'monday',
Tue: 'tuesday',
Wed: 'wednesday',
Thu: 'thursday',
Fri: 'friday',
Sat: 'saturday'
}
var value = data.reduce(function(m, i, x){
for (d in valMap){
if (i.created_at.indexOf(d) === 0){
m[valMap[d]]++;
return m;
}
}
return m;
}, {
sunday: 0,
monday: 0,
tuesday: 0,
wednesday: 0,
thursday: 0,
friday: 0,
saturday: 0
});
结果类似于:
{
sunday: 0,
monday: 1,
tuesday: 3,
wednesday: 0,
thursday: 1,
friday: 0,
saturday: 6
}
答案 1 :(得分:0)
如果您想查看对象的字段名称中是否存在该键,请使用indexOf
function getValues(obj, key) {
var objects = [];
for (var i in obj) {
if (!obj.hasOwnProperty(i)) continue;
if (typeof obj[i] == 'object') {
objects = objects.concat(getValues(obj[i], key));
} else if (s.indexOf(key) !== -1) {
objects.push(obj[i]);
}
}
return objects;
}