纯javascript(es2015)函数从树json结构中提取子级

纯javascript(es2015)函数从树json结构中提取子级,javascript,json,ecmascript-6,azure-cosmosdb,Javascript,Json,Ecmascript 6,Azure Cosmosdb,我有一个DocumentDb数据库,其中一种文档类型具有以下结构: { 结构:{ id:7d2d5d3f-0c82-4910-aa0b-54d8067588a3, 单位类型:1, 名称:我公司, 语言:nb NO, 经理:[], logoURL:null, 组织信息:{ Orgnumber:null, 国家:空, 扇区:空, 代码:null }, 标签:[], 受访者:[], 儿童单位:[ { id:3fb44416-8fa8-4b60-8c0c-03b333d176f7, 单位类型:3, 名

我有一个DocumentDb数据库,其中一种文档类型具有以下结构:

{ 结构:{ id:7d2d5d3f-0c82-4910-aa0b-54d8067588a3, 单位类型:1, 名称:我公司, 语言:nb NO, 经理:[], logoURL:null, 组织信息:{ Orgnumber:null, 国家:空, 扇区:空, 代码:null }, 标签:[], 受访者:[], 儿童单位:[ { id:3fb44416-8fa8-4b60-8c0c-03b333d176f7, 单位类型:3, 名称:市场营销, 语言:nb NO, 经理:[], logoURL:null, 组织信息:{ Orgnumber:null, 国家:空, 扇区:空, 代码:null }, 标签:[], 受访者:[], 儿童单位:[ { 识别号:49932d6f-518e-4511-9bc9-f6f747a81968, 单位类型:3, 名称:互联网,, 语言:nb NO, 经理:[], logoURL:null, 组织信息:{ Orgnumber:null, 国家:空, 扇区:空, 代码:null }, 标签:[], 受访者:[], 儿童单位:[], 家长:3fb44416-8fa8-4b60-8c0c-03b333d176f7 }, { id:aa76010d-ae59-49b1-b929-9572eb536cc6, 单位类型:3, 姓名:DM, 语言:nb NO, 经理:[], logoURL:null, 组织信息:{ Orgnumber:null, 国家:空, 扇区:空, 代码:null }, 标签:[], 受访者:[], 儿童单位:[], 家长:3fb44416-8fa8-4b60-8c0c-03b333d176f7 } ], 家长:7d2d5d3f-0c82-4910-aa0b-54d8067588a3 }, { id:be1d142a-e09d-4828-aceb-07d65321da5d, 单位类型:3, 名称:支持,, 语言:nb NO, 经理:[], logoURL:null, 组织信息:{ Orgnumber:null, 国家:空, 扇区:空, 代码:null }, 标签:[], 受访者:[], 儿童单位:[], 家长:7d2d5d3f-0c82-4910-aa0b-54d8067588a3 } ], 父项:null }, id:07b4c7c5-7324-4eef-9e4e-9deb70615ec4, 类型:组织, 所有者:auth0 | 571f2eb34247998a66726b02, 公众:错,, _rid:GPFBALQREAMNAAAAAA==, _self:dbs/GPFbAA==/colls/GPFbALqREAM=/docs/GPFbALqREAMNAAAAAAAAAA=/,, _etag:\00004707-0000-0000-5881cef40000\,, _附件:附件/,, _ts:1484902132 } 解决了大部分这些问题

如果需要,您可以填充函数:

var db={ 结构:{ id:7d2d5d3f-0c82-4910-aa0b-54d8067588a3, 单位类型:1, 名称:我公司, 语言:nb NO, 经理:[], logoURL:null, 组织信息:{ Orgnumber:null, 国家:空, 扇区:空, 代码:null }, 标签:[], 受访者:[], 儿童单位:[ { id:3fb44416-8fa8-4b60-8c0c-03b333d176f7, 单位类型:3, 名称:市场营销, 语言:nb NO, 经理:[], logoURL:null, 组织信息:{ Orgnumber:null, 国家:空, 扇区:空, 代码:null }, 标签:[], 受访者:[], 儿童单位:[ { 识别号:49932d6f-518e-4511-9bc9-f6f747a81968, 单位类型:3, 名称:互联网,, 语言:nb NO, 经理:[], logoURL:null, 组织信息:{ Orgnumber:null, 国家:空, 扇区:空, 代码:null }, 标签:[], 受访者:[], 儿童单位:[], 家长:3fb44416-8fa8-4b60-8c0c-03b333d176f7 }, { id:aa76010d-ae59-49b1-b929-9572eb536cc6, 单位类型:3, 姓名:DM, 语言:nb NO, 经理:[], logoURL:null, 组织信息:{ Orgnumber:null, 国家:空, 扇区:空, 代码:null }, 标签:[], 受访者:[], 儿童单位:[], 家长:3fb44416-8fa8-4b60-8c0c-03b333d176f7 } ], 家长:7d2d5d3f-0c82-4910-aa0b-54d8067588a3 }, { id:be1d142a-e09d-4828-aceb-07d65321da5d, 单位类型:3, 名称:支持,, 语言:nb NO, 经理:[], logoURL:null, 组织信息:{ Orgnumber:null, 国家:空, 扇区:空, 代码:null }, 标签:[], 受访者:[], 儿童单位:[], 家长:7d2d5d3f-0c82-4910-aa0b-54d8067588a3 } ], 父项:null }, id:07b4c7c5-7324-4eef-9e4e-9deb70615ec4, 类型:组织, 所有者:auth0 | 571f2eb34247998a66726b02, 公众:错,, _rid:GPFBALQREAMNAAAAAA==, _self:dbs/GPFbAA==/colls/GPFbALqREAM=/docs/GPFbALqREAMNAAAAAAAAAA=/,, _etag:\00004707-0000-0000-5881cef40000\,, _附件:附件/,, _ts:1484902132 }; 函数getDocumentorgID,docID{ //用于保存遍历进度的变量 var extract=db 结构 .儿童单位 .findfunction findfunorganization{ 返回组织.id==orgID; }; //如果未找到组织,则返回false 如果提取类型==未定义{ 返回false; } //遍历组织子对象 摘录 .儿童单位 .findfunction findfunc文档{ return document.id==docID; }; //如果未找到组织,则返回false 如果提取类型==未定义{ 返回false; } //如果我们达到这一点,我们会找到一个结果,然后返回 回流提取物; } //运行试验 console.loggetDocument3fb44416-8fa8-4b60-8c0c-03b333d176f7,aa76010d-ae59-49b1-b929-9572eb536cc6; console.loggetDocument3fb44416-8fa8-4b60-8c0c-03b333d176f7,错误; console.loggetDocumentERR,aa76010d-ae59-49b1-b929-9572eb536cc6; console.loggetDocumentERR,ERR 您可以使用迭代和递归样式

函数getObjectobject,id{ var-r; 返回函数itero{ 如果o.id==id{ r=o; 返回true; } 如果Array.isArrayo.childUnits{ 返回o.childUnits.someter; } }对象&r| |未定义; } var数据={structure:{id:7d2d5d3f-0c82-4910-aa0b-54d8067588a3,单位类型:1,名称:MyCompany,语言:nb NO,经理:[],logoURL:null,组织信息:{Orgnumber:null,国家:null,部门:null,代码:null},标签:[],受访者:[],儿童单位:[{id:3fb44416-8fa8-4b60-8c0c-03b333d176f7,单位类型:3,姓名:营销,语言:nb编号,经理:[],logoURL:null,组织信息:{Orgnumber:null,国家:null,部门:null,代码:null},标签:[],受访者:[],儿童单位:[{id:49932d6f-518e-4511-9bc9-f6f747a81968,单位类型:3,姓名:互联网,语言:nb编号,经理:[],logoURL:null,orginfo:{Orgnumber:null,Country:null,Sector:null,Code:null},tags:[],应答者:[],子单元:[],父单元:3fb44416-8fa8-4b60-8c0c-03b333d176f7},{id:aa76010d-ae59-49b1-b929-9572eb536cc6,单元类型:3,名称:DM,语言:nb编号,经理:[],logoURL:null,orginfo:{Orgnumber:null,Country:null,Sector:null,Code:null},tags:[],应答者:[],子单元:[],父单元:3fb44416-8fa8-4b60-8c0c-03b333d176f7}],父单元:7d2d5d3f-0c82-4910-aa0b-54d8067588a3},{id:be1d142a-e09d-4828-aceb-07D65321DAD,单元类型:3,名称:支持,语言:nb编号,管理员:[],URL:null,orginfo:{Orgnumber:null,Country:null,Sector:null,Code:null},标记:[],应答者:[],子单位:[],父项:7d2d5d3f-0c82-4910-aa0b-54d8067588a3},父项:null},id:07b4c7c5-7324-4eef-9e4e-9deb70615ec4,类型:组织,所有者:auth0 | 571f2eb34247998a66726b02,公共:false,_-rid:gpfbalqreamnaaaaaaaaaaaaaaaaaa==,_-self:dbs/gpfbaaa=/colls/GPFbALqREAM=/docs/gpfbalqreamnaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa==/,_-etag:\00004707-0000-0000-0000-58 81cef40000\,_附件:附件/,_ts:1484902132}; console.loggetObjectdata.structure,“foo”; console.loggetObjectdata.structure,“aa76010d-ae59-49b1-b929-9572eb536cc6”;
.as console wrapper{max height:100%!important;top:0;}提高性能的最佳方法是利用文档内联接-

假设structure属性实际上是文档的一部分,则联接查询的外观如下所示:

SELECT c.id, childUnit 
FROM c JOIN childUnit IN c.structure.childUnits 
WHERE c.structure.id = "7d2d5d3f-0c82-4910-aa0b-54d8067588a3" 
    AND childUnit.id = "3fb44416-8fa8-4b60-8c0c-03b333d176f7"*
SELECT c.id, childUnit 
FROM c JOIN childUnit IN c.childUnits 
WHERE c.id = "7d2d5d3f-0c82-4910-aa0b-54d8067588a3" 
    AND childUnit.id = "3fb44416-8fa8-4b60-8c0c-03b333d176f7"*
如果structure属性实际上不是原始文档的一部分,则联接查询将如下所示:

SELECT c.id, childUnit 
FROM c JOIN childUnit IN c.structure.childUnits 
WHERE c.structure.id = "7d2d5d3f-0c82-4910-aa0b-54d8067588a3" 
    AND childUnit.id = "3fb44416-8fa8-4b60-8c0c-03b333d176f7"*
SELECT c.id, childUnit 
FROM c JOIN childUnit IN c.childUnits 
WHERE c.id = "7d2d5d3f-0c82-4910-aa0b-54d8067588a3" 
    AND childUnit.id = "3fb44416-8fa8-4b60-8c0c-03b333d176f7"*

此类型的查询将仅返回文档中指定的子单位。WHERE筛选器中的unit id和childUnit id提高了查询性能。

structure属性是文档的一部分,与childUnits具有相同的结构。代码属性中可能不太清楚的是,单元嵌套在树结构中。每个单位都有自己的子单位数组,包含更多单位,以此类推。我认为,为了让你的例子起作用,你需要先把结构弄平。更清楚地说:structure属性也可以是一个带有单个单元的childUnits数组。递归数据结构很难以性能的方式进行查询。我发现使用完全物化的路径方法效果最好。你可以阅读这个方法,还有。有人证实了吗?这在DocumentDB中的存储过程中起作用吗?