我需要在一个大型JSON文件中搜索id
并返回所有属性。但是,有一个parentId
属性。这对应于我需要包含其属性的另一个对象的id
,可能还有另一个parentId
等。
m.getAttrs = function(o){
var a = []
// get the model based on id or object.id
if(o instanceof String)
var obj = json.models.filter(i => i.id == o)[0]
else
var obj = json.models.filter(i => i.id == o.id)[0]
////// On 2nd iteration: "TypeError: Cannot read property 'hasOwnProperty' of undefined" ///////////////
if( obj.hasOwnProperty("parentId") && obj.parentId != ""){
// get parent id
var pid = obj.parentId
// get parent attributes
a.push(m.getAttrs(pid)) // RECURSION //
}
// get attributes
var attrs = obj.attrids
// get Attribute Names
for(aid in attrs){
var aName = json.attrs.filter(i => i.id == aid)
a.push(aName)
}
return a
}
我看到错误,其中obj
未在getAttrs的第一次迭代之后定义。我认为这是因为json.models.filter...
还没有完成,但它可能是很多东西。
我已经多次尝试实施承诺,但似乎无法正常工作,这让我的代码太乱了,我想把它包含在这里。
如何在找到合适的模型 CONTINUE (而不是执行其他功能)后实现承诺说&#34;&#34;?< / p>
答案 0 :(得分:0)
这是我发现的......
Array.prototype.filter
是同步的,所以我的问题首先不是异步。事实证明,除非您专门创建一个String变量,否则instanceof String
不起作用。这是我发现的一个帖子:Why does instanceof return false for some literals? 这修复了我的代码:
if(typeof o === "string")
var obj = json.models.filter(i => i.id == o)[0]
else
var obj = json.models.filter(i => i.id == o.id)[0]