Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我怎样才能使这段代码更好(消除for循环)_Javascript - Fatal编程技术网

Javascript 我怎样才能使这段代码更好(消除for循环)

Javascript 我怎样才能使这段代码更好(消除for循环),javascript,Javascript,问题:我知道这个带有for循环的代码不是最好的,而且非常简单,但我也听说为每个循环嵌套是个坏主意。那么,我如何编辑此代码以使其更优雅呢 allowedCardBrands.forEach((card) => { let cardInfo = {} for (var i = 0; i < cardDefinitionsResponse.length; i++ ){ if (card === car

问题:我知道这个带有for循环的代码不是最好的,而且非常简单,但我也听说为每个循环嵌套是个坏主意。那么,我如何编辑此代码以使其更优雅呢

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