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;
});
它将返回一个结果,但是如果我将其从 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
});
演示:http://jsfiddle.net/56h7daod/
那是因为你只测试第一个元素(零作为索引);
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;
});
http://jsfiddle.net/tdb70f50/2/
结合
已经提供的答案,您可以充分利用映射和归约来提取嵌套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];
};
相关文章:
- 同源策略目的|用户数据与基本页面数据|客户端页面抓取
- VBA正在抓取不在HTML源文件中的生成内容
- 尝试使用Node.js动态路由从IMDB中抓取电影内容.但是在我的output.json文件中没有定义
- 如何从网站上抓取链接和图片
- 用jquery抓取图像SRC-attr
- Javascript Regex-从价格中抓取分隔符
- 使用网络服务器的IP地址而不是域名对其进行屏幕抓取
- 节点中的空对象 X 射线抓取器.js不工作
- Javascript:根据子对象值抓取数组中的对象
- 在一个 jQuery 对象中抓取多种类型的标签
- 创建一个 JavaScript 对象,用于抓取每个数组项并对其进行整理
- JQuery - 抓取事件对象的父级
- 抓取另一个对象中的特定对象
- 错误:无法将数组转换为对象数据抓取脚本
- 烬数据抓取已经加载的对象从存储
- 我如何从flash对象抓取http响应
- 用request/cheerio抓取html到js对象中
- 抓取隐藏在javascript对象后面的文本
- 反应.js动态抓取对象,导致未定义
- 使用BeautifulSoup从网页上抓取javascript / json对象