gpt4 book ai didi

javascript - 迭代对象数组并过滤掉不匹配的对象

转载 作者:行者123 更新时间:2023-12-03 08:07:57 26 4
gpt4 key购买 nike

我正在尝试找出进行某些对象迭代/突变的最佳方式。我试图找到所有具有“DB” Angular 色的服务器的“sids”。预期结果将是一个变量,该变量具有任何 SID 的完整属性(tier、sidadm、sid、orasid、服务器),这些 SID 的服务器具有 Angular 色 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"]
}
]
}
];

这就是我到目前为止的工作,但不排除具有空服务器 Prop 的 SID。一定有更好的方法用 lodash 来编写这个,对吧?

// 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 提供了这两种方法的实现。

如果您还想仅包含具有该特定 Angular 色的服务器,您可以映射过滤:

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});
}
});

关于javascript - 迭代对象数组并过滤掉不匹配的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34294879/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com