Javascript 使用下划线.js在深度嵌套的JSON中查找值

Javascript 使用下划线.js在深度嵌套的JSON中查找值,javascript,json,underscore.js,Javascript,Json,Underscore.js,我对Javascript非常陌生,我刚刚学习了下划线.js。我有一个嵌套很深的JSON对象,我需要使用下划线来查找键/值对,然后用它填充各种HTML表。如果结构更浅,使用uygdb之类的东西会很容易,但我不知道如何穿过前几个嵌套层(即surveyGDB、table、tablenames)。JSON对象来自由多个嵌套结构(从不同的数据库表混合而成)组成的XML 例如,我想要“QaQCPoints”表中“Code”的所有值,因此我尝试: var codes = _.flatten(_.pluck(J

我对Javascript非常陌生,我刚刚学习了下划线.js。我有一个嵌套很深的JSON对象,我需要使用下划线来查找键/值对,然后用它填充各种HTML表。如果结构更浅,使用uygdb之类的东西会很容易,但我不知道如何穿过前几个嵌套层(即surveyGDB、table、tablenames)。JSON对象来自由多个嵌套结构(从不同的数据库表混合而成)组成的XML

例如,我想要“QaQCPoints”表中“Code”的所有值,因此我尝试:

var codes = _.flatten(_.pluck(JSONData.surveyGDB.table.tablename[1].record[0], "Code" ));
console.log(codes);
在控制台中,这将返回一个长度为5但值为空的数组。 我做错了什么


我还希望根据诸如“#text”键值之类的内容在表中搜索“Code”值,而不是仅仅使用它在对象中的位置。

如果我理解正确,您希望总是在JSONData.surveyGDB.table.tablename数组中搜索记录数组以进行一些查询。这意味着您需要根据某个参数查找记录,并从找到的记录中返回一些内容

请注意,在您的示例中,
record
属性有时是一个数组,有时是一个对象(对于表
SurveyInfo
),因此我假设您需要考虑这一点。 您可以使用一个小函数来提取数据并处理对象和数组:

function extract(record, prop) {
  if (Array.isArray(record)) { 
    return _.pluck(record, prop);
  } else {
    return record[prop];
  }
}
用法示例:

我想要“QaQCPoints”表中“Code”的所有值。 我还希望根据诸如“#text”键值之类的内容搜索表中的“Code”值,而不是仅仅使用它在对象中的位置

要实现这一点,首先使用查找记录,然后使用上述方法从中提取
code
值:

var table = JSONData.surveyGDB.table.tablename;

// find an item that has `#text` property equal to `QaQcPoints`
var item = _.find(table, function(r) {
  return r['#text'] === 'QaQcPoints';
});

// extract codes from the found item's record property
var code = extract(item.record, 'Code');
// output ["tp", "tb", "to", "bl", "bf"]
运行示例:

var JSONData={
“调查数据库”:{
“文件名”:“.\\Topo\\SurveyGeoDatabase.gdb”,
“表格”:{
“表名”:[{
“#文本”:“调查信息”,
“记录”:{
“OBJECTID”:“1”,
“站点ID”:“CBW05583-345970”,
“分水岭”:“约翰·戴”,
“访问类型”:“首次访问”,
“测量仪器”:“全站仪”,
“进口日期”:“2015-07-22T09:08:42”,
“StreamName”:“Duncan Creek”,
“仪器型号”:“TopCon磁铁v2.5.1”,
“现场季”:“2015”
}
}, {
“#文本”:“QaQcPoints”,
“记录”:[{
“OBJECTID”:“1”,
“时间戳”:“2015-07-22T09:18:43”,
“代码”:“tp”,
“计数”:“357”
}, {
“OBJECTID”:“2”,
“时间戳”:“2015-07-22T09:18:43”,
“代码”:“tb”,
“计数”:“92”
}, {
“OBJECTID”:“3”,
“时间戳”:“2015-07-22T09:18:43”,
“代码”:“至”,
“计数”:“8”
}, {
“OBJECTID”:“4”,
“时间戳”:“2015-07-22T09:18:43”,
“代码”:“bl”,
“计数”:“279”
}, {
“OBJECTID”:“5”,
“时间戳”:“2015-07-22T09:18:43”,
“代码”:“bf”,
“计数”:“18”
}]
}, {
“#文本”:“QAQC”,
“记录”:[{
“OBJECTID”:“1”,
“时间戳”:“2015-07-22T09:43:08”,
“SurveyExtentCount”:“,
“WaterExtentCount”:“,
“ChannelUnitsCount”:“,
“ChannelUnitsUnique”:”
}, {
“OBJECTID”:“2”,
“时间戳”:“2015-07-22T13:35:15”,
“SurveyExtentCount”:“1”,
“WaterExtentCount”:“1”,
“ChannelUnitScont”:“21”,
“ChannelUnitsUnique”:“21”
}]
}]
}
}
}
功能提取(记录、道具){
if(Array.isArray(记录)){
回拨(记录、道具);
}否则{
返回记录[道具];
}
}
var table=JSONData.surveyGDB.table.tablename;
var item=\查找(表,函数(r){
返回r['#text']==='QaQcPoints';
});
console.dir(项目);
var代码=提取(item.record,'code');
控制台日志(代码)

您有两个阶段的问题。第一阶段是找出哪张表是QAQC点。如果这始终是JSONData.surveyGDB.table.tablename[1],那么就很好了

下一个阶段是把你的数据拿出来。您可以在大多数情况下使用本机数组操作(除非您使用的是非常旧的浏览器)。因此:


会成功的。

谢谢您的快速回复。代码的第二行在控制台中给了我一个错误,但是:未捕获引用错误:未定义记录。我需要将记录声明为空数组吗?woops,很好的一点-我命名的是变量表,而不是记录。我编辑了这篇博文。这真是太棒了。正是我需要的。谢谢你的帮助@tinyplanet00没问题,很乐意帮助:)
var table = JSONData.surveyGDB.table.tablename;

// find an item that has `#text` property equal to `QaQcPoints`
var item = _.find(table, function(r) {
  return r['#text'] === 'QaQcPoints';
});

// extract codes from the found item's record property
var code = extract(item.record, 'Code');
// output ["tp", "tb", "to", "bl", "bf"]
var table = JSONData.surveyGDB.table.tablename[1].record;
var codeArray = table.map(function(val) { return val.Code; });