我有一个对象数组:
[{
"12": {"data": [{"thisID": "44"},{"thisID": "55"}],
"settings": {"other":"other"}}
},{
"15": {"data": [{"thisID": "66"},{"thisID": "77"}],
"settings": {"other":"other"}}
}]
使用underscore.js我想访问thisID
密钥为77
的对象。
我是这样做的,但我相信还有更好的方法吗?
var found = _.map(array, function (d) {
return _.findWhere(d.data, {thisID: "77"});
})
.filter(function(n){ return n != undefined })
console.log(found) //[{thisID:x, a:a, ....}]
答案 0 :(得分:0)
首先,我认为如果您要使用下划线,则应将其用于所有内容 - 您不应该更改回Javascript的内置.filter
。我相信下划线将遵循内置方法,如果它存在,否则它将替换它自己的实现
其次,由于数据的嵌套特性,您需要根据进一步过滤其值data
属性来过滤对象。这说明_.values(obj)[0].data
作为第二次调用过滤的第一个参数传递。
最后,如果您确定只有一个具有所需thisID
值的对象,您最终可以始终引用found[0]
。因此,即使我提交的代码也可能有所改进,但我希望它能指出你正确的方向。一个有益的练习可能是创建一个函数,将所需的thisID
作为参数而不是硬编码。
var found = _.filter(array, function(obj) {
var hasId77 = _.filter(_.values(obj)[0].data, function(data) {
return data.thisID == 77
});
if (!_.isEmpty(hasId77)) {
return obj;
}
});
console.log(JSON.stringify(found));
输出:
[
{
"15":{
"data":[
{
"thisID":"66"
},
{
"thisID":"77"
}
],
"settings":{
"other":"other"
}
}
}
]