Javascript:根据子对象值抓取数组中的对象
Javascript: grab object in array based on subobject value
如果我有这个对象:
DropIds = [
{
"studentId": 5,
"dropboxItems": [
{
"dropBoxId": 230,
}
]
},
{
"studentId": 4,
"dropboxItems": [
{
"dropBoxId": 585,
},
{
"dropBoxId": 586,
}
]
}
]
然后我尝试 运行 此代码:
var result = $.grep(DropIds, function(e){
return e.dropboxItems[0].dropBoxId == 585;
});
它会 return 结果,但是如果我将它从 585 更改为 586 结果是空的。
http://jsfiddle.net/tdb70f50/1/
看来我的代码只会检查数组中的第一个对象。
dropBoxId不止一个时,如何抓取对象?
谢谢!
您需要检查数组中的所有项目,而不仅仅是 0
索引,您可以使用 Array.prototype.filter
var result = DropIds.filter(function(item) {
return item.dropboxItems.filter(function(box) {
return box.dropBoxId == 586
}).length
});
那是因为您只测试第一个元素(零作为索引);
return e.dropboxItems[0].dropBoxId == 585;
您必须在元素内部循环测试每个对象;
var result = $.grep(DropIds, function(e){
if(!e.dropboxItems) return false;
for(var i = 0; i < e.dropboxItems.length; i++) {
if(e.dropboxItems[i].dropBoxId == 586) return true
}
return false;
});
结合已经给出的答案,可以利用好mapping和reduce来提取嵌套dropBoxItems
的数组,然后对给定的dropBoxId
进行搜索,即:
function getByDropBoxId(id, dropId) {
return dropId
// Pluck the nested arrays into a 2d array
.map(function (dropId) {
return dropId.dropboxItems;
})
// flatten / reduce them to a single array.
.reduce(function (soFar, dropBoxItems) {
return soFar.concat(dropBoxItems);
}, [])
// filter out the ones you are looking for and return the first.
.filter(function(dropBoxItem) {
return dropBoxItem.dropBoxId === id;
})[0];
};
如果我有这个对象:
DropIds = [
{
"studentId": 5,
"dropboxItems": [
{
"dropBoxId": 230,
}
]
},
{
"studentId": 4,
"dropboxItems": [
{
"dropBoxId": 585,
},
{
"dropBoxId": 586,
}
]
}
]
然后我尝试 运行 此代码:
var result = $.grep(DropIds, function(e){
return e.dropboxItems[0].dropBoxId == 585;
});
它会 return 结果,但是如果我将它从 585 更改为 586 结果是空的。
http://jsfiddle.net/tdb70f50/1/
看来我的代码只会检查数组中的第一个对象。
dropBoxId不止一个时,如何抓取对象?
谢谢!
您需要检查数组中的所有项目,而不仅仅是 0
索引,您可以使用 Array.prototype.filter
var result = DropIds.filter(function(item) {
return item.dropboxItems.filter(function(box) {
return box.dropBoxId == 586
}).length
});
那是因为您只测试第一个元素(零作为索引);
return e.dropboxItems[0].dropBoxId == 585;
您必须在元素内部循环测试每个对象;
var result = $.grep(DropIds, function(e){
if(!e.dropboxItems) return false;
for(var i = 0; i < e.dropboxItems.length; i++) {
if(e.dropboxItems[i].dropBoxId == 586) return true
}
return false;
});
结合已经给出的答案,可以利用好mapping和reduce来提取嵌套dropBoxItems
的数组,然后对给定的dropBoxId
进行搜索,即:
function getByDropBoxId(id, dropId) {
return dropId
// Pluck the nested arrays into a 2d array
.map(function (dropId) {
return dropId.dropboxItems;
})
// flatten / reduce them to a single array.
.reduce(function (soFar, dropBoxItems) {
return soFar.concat(dropBoxItems);
}, [])
// filter out the ones you are looking for and return the first.
.filter(function(dropBoxItem) {
return dropBoxItem.dropBoxId === id;
})[0];
};