Javascript 我怎样才能使这段代码更好(消除for循环)
问题:我知道这个带有for循环的代码不是最好的,而且非常简单,但我也听说为每个循环嵌套是个坏主意。那么,我如何编辑此代码以使其更优雅呢Javascript 我怎样才能使这段代码更好(消除for循环),javascript,Javascript,问题:我知道这个带有for循环的代码不是最好的,而且非常简单,但我也听说为每个循环嵌套是个坏主意。那么,我如何编辑此代码以使其更优雅呢 allowedCardBrands.forEach((card) => { let cardInfo = {} for (var i = 0; i < cardDefinitionsResponse.length; i++ ){ if (card === car
allowedCardBrands.forEach((card) => {
let cardInfo = {}
for (var i = 0; i < cardDefinitionsResponse.length; i++ ){
if (card === cardDefinitionsResponse[i].brand){
cardInfo.brand = cardDefinitionsResponse.brand;
cardInfo.issuer = cardDefinitionsResponse.issuers[0].name;
cardInfo.brandLogo = cardDefinitionsResponse.logo;
cardInfo.issuerLogo = cardDefinitionsResponse.issuers[0].logo;
}
}
allowedCardLogos.push(cardInfo);
})
这些嵌套循环的问题在于,对于allowedCardBrands数组的每个项,您都在重复循环相同的cardDefinitionsResponse集合。一种解决方案是只循环一次definitionsByBrand,并构建一个快速查找结构,以便allowedCardBrands循环可以更快地完成
const definitionsByBrand = cardDefinitionsResponse.reduce((lookup, item) => {
lookup.set(item.brand, item);
return lookup;
}, new Map());
const allowedCardLogos = allowedCardBrands.map(brand => {
const match = definitionsByBrand.get(brand);
return match
? {
brand: match.brand,
issuer: match.issuers[0].name,
brandLogo: match.logo,
issuerLogo: match.issuers[0].logo
}
: {}
});
你从哪里听说嵌套循环是个坏主意?没关系,在最深的循环中,你实际上没有做任何非常密集的事情。现在,如果你有5-6个嵌套循环,在最深的循环中,你调用了15个函数或其他什么,你可能会遇到一个问题——不要相信这些炒作。for循环很好。如果需要for循环,则必须使用for循环。简单…For循环很好,但是像这样的嵌套For循环的复杂度是*m。这个问题可能更适合这个问题,因为它看起来更复杂,因为它非常简单。如果数组足够小,你知道你不必关心性能,你可以坚持嵌套For循环,但对于较大的结构,这将使复杂性从On*m降低到On+,而不是更复杂。它更简单。它避免了在相同的数据中重复n次。代码本身似乎更复杂,不管它在技术上多么简单。
const allowedCardLogos = allowedCardBrands
.map(card => {
return cardDefinitionsResponse
.filter(response => response.brand === card)
.map(filteredResponse => ({
brand: filteredResponse.brand,
issuer: filteredResponse.issuers[0].name,
brandLogo: filteredResponse.logo,
issuerLogo: filteredResponse.issuers[0].logo
}));
})
.flat();