迭代对象数组并过滤掉不匹配的对象
iterate over array of objects and filter out not matching
我正在努力找出进行一些对象迭代/突变的最佳lodashy方法。我试图找到所有具有"DB"角色的服务器的"sid"。预期的结果将是一个变量,该变量具有任何sid的完整道具(tier、sidadm、sid、orasid、server),这些sid的服务器具有角色DB。
数据
var landscape = [
{
"tier": "production",
"sidadm": "ptpadm",
"sid": "PTP",
"orasid": "oraptp",
"servers": [
{
"hostname": "testep00",
"roles": ["DB"]
},
{
"hostname": "testep01",
"roles": ["DG"]
},
{
"hostname": "testep02",
"roles": ["SAPMS"]
},
{
"hostname": "testep03",
"roles": ["SAPDI"]
},
{
"hostname": "testep04",
"roles": ["SAPDI"]
},
{
"hostname": "testep05",
"roles": ["SAPDI"]
},
{
"hostname": "testep06",
"roles": ["SAPDI"]
}
]
},
{
"tier": "techsandbox",
"sidadm": "bwzadm",
"sid": "BWZ",
"orasid": "orabwz",
"servers": [
{
"hostname": "testbw80",
"roles": ["DB"]
},
{
"hostname": "testbw81",
"roles": ["DG"]
},
{
"hostname": "testbw82",
"roles": ["SAPMS"]
},
{
"hostname": "testbw83",
"roles": ["SAPDI"]
}
]
},
{
"tier": "techsandbox",
"sidadm": "eczadm",
"sid": "ECZ",
"orasid": "oraecz",
"servers": [
{
"hostname": "testec81",
"roles": ["DG"]
},
{
"hostname": "testec82",
"roles": ["SAPDI", "SAPMS"]
}
]
}
];
到目前为止,这就是我所拥有的,有点,但不排除具有空服务器道具的SID。一定有更好的方法用洛达什写这篇文章,对吧?
// find me all SIDs with role "DB",
// should filter landscape and only return sids which have servers role=DB
// also should only contain the servers which are role=DB
var ls = _.extend({}, landscape);
_.each(ls, function (sid) {
var servers = _.filter(sid.servers, function (server) {
return _.contains(server.roles, 'DB');
});
// still need to strip out SID objects which have empty servers prop
sid.servers = servers;
});
console.log('sids1() ::', ls);
只要一个简单的filter
+some
就足够了:
var result = landscape.filter(function(sid) {
return sid.servers.some(function(server) {
return server.roles.indexOf("DB") > -1;
});
});
如果你喜欢的话,Lodash提供了这两种功能的实现
如果您还希望只包括具有该特定角色的服务器,则可以使用map
和filter
:
var result = landscape
.map(function(sid) {
return Object.assign( // "clone" object
{},
sid,
{
servers: sid.servers.filter(function(server) {
return server.roles.indexOf("DB") > -1;
})
}
);
})
.filter(function(sid) {
return sid.servers.length > 0;
});
这也可以组合成单个reduce
或使用简单的forEach
:
var result = [];
landscape.forEach(function(sid) {
var servers = sid.servers.filter(function(server) {
return server.roles.indexOf("DB") > -1;
});
if (servers.length > 0) {
result.push(Object.assign({}, side, {servers: servers});
}
});
相关文章:
- 高库存时期时间与时区不匹配
- JS变量返回的对象不是值
- 对象不支持属性或方法“自动完成”
- react路由器使用简单的javascript路由器配置来处理不匹配的路径
- Javascript:图像与单选按钮的值不匹配
- Mongoose TypeError:实例化模式类型的对象时,对象不是函数
- JavaScript对象不是从原型链继承的
- “;Stub对象”;对象不符合检查点's条件
- 下拉 Javascript 错误:对象不支持属性或方法“匹配”
- 签名与 s3 上传对象不匹配
- 比较两个数组并删除不匹配的对象
- 迭代对象数组并过滤掉不匹配的对象
- 对象长度不匹配
- 为什么不't regexp用作对象键匹配
- 无法在对象内返回对象.与string.prototype.replace方法不匹配的每个循环的关键字
- AngularJS过滤器:返回不匹配预期字符串的对象数组
- 删除不匹配字符串的javascript对象属性
- Angular过滤器,将ng-repeat对象中的字符串数组与字符串数组进行比较,并过滤掉不匹配的对象
- 我可以不使用字符串值来查询parse.com数据对象中保存的对象的匹配吗?
- Json字符串javascript对象结果不匹配