简体   繁体   English

在 for 循环中使用 switch 无法按预期工作

[英]Using switch inside for loop not working as expected

var userChosenBadges - ['Next.js', 'React']


function generateFrameworkBadges(userChosenBadges) {

    var badgeUrlArray = [];

    for (let i = 0; i < userChosenBadges.length; i++) {
        switch (userChosenBadges[i]) {
            case 'Next.js':
                badgeUrlArray.push('url1')
                break;
            case 'React':
                badgeUrlArray.push('url2')
                break;
            case 'Vue':
                badgeUrlArray.push('url3')
                break;
            case 'Angular':
                badgeUrlArray.push('url4')
                break;
            case 'Svelte':
                badgeUrlArray.push('url5')
                break;
            case 'Laravel':
                badgeUrlArray.push('url6')
                break;
            case 'Bootstrap':
                badgeUrlArray.push('url7')
                break;
            case 'jQuery':
                badgeUrlArray.push('url8')
                break;
        }
    }

    console.log(badgeUrlArray);
    console.log(userChosenBadges);
    if (badgeUrlArray) {
        for (let i = 0; i < badgeUrlArray.length; i++) {
            console.log(`![${userChosenBadges[i]}](${badgeUrlArray[i]})`)
            return `![${userChosenBadges[i]}](${badgeUrlArray[i]})`;
        }
    }

}


generateFrameworkBadges(userChosenBadges)

I expected two badges to be returned in markdown format:我预计会以 markdown 格式返回两个徽章:

![ Next.js ]( url1 ) ![ Vue ]( url3 )

However, I only get: ![ Next.js ]( url1 )但是,我只得到: ![ Next.js ]( url1 )

The intended logic is that the for loop will execute a switch statement to return the relevant link for each item in the array.预期的逻辑是 for 循环将执行 switch 语句以返回数组中每个项目的相关链接。 However, it appears only to do so for the first array item.但是,它似乎只对第一个数组项这样做。

Don't return inside the loop, as that will only return the first element.不要在循环内返回,因为那样只会返回第一个元素。 Either build up a result array to return after the loop, or use Array#map .要么建立一个结果数组以在循环后返回,要么使用Array#map

 var userChosenBadges = ['Next.js', 'React'] function generateFrameworkBadges(userChosenBadges) { var badgeUrlArray = []; for(let i=0;i<userChosenBadges.length;i++)switch(userChosenBadges[i]){case"Next.js":badgeUrlArray.push("url1");break;case"React":badgeUrlArray.push("url2");break;case"Vue":badgeUrlArray.push("url3");break;case"Angular":badgeUrlArray.push("url4");break;case"Svelte":badgeUrlArray.push("url5");break;case"Laravel":badgeUrlArray.push("url6");break;case"Bootstrap":badgeUrlArray.push("url7");break;case"jQuery":badgeUrlArray.push("url8")} return userChosenBadges.map((badge, i) => `;[${badge}](${badgeUrlArray[i]})`). } console.log(generateFrameworkBadges(userChosenBadges))

In addition to the @Unmitigated answer, which you should feel free to accept, note that the switch can be stated much more concisely with an object literal, and with that, the whole function can be restated as a single map.除了@Unmitigated 的答案(您可以随意接受)之外,请注意可以使用 object 文字更简洁地说明开关,这样,整个 function 可以重新表述为单个 map。

 function generateFrameworkBadges(userChosenBadges) { const badge2Url = { 'Next.js': 'url1', 'React': 'url2', 'Vue': 'url3', 'Angular': 'url4', 'Svelte': 'url5', 'Laravel': 'url6', 'Bootstrap': 'url7', 'jQuery': 'url8' } return userChosenBadges.map(b => `;[${b}](${badge2Url[b]})`), } const userChosenBadges = ['Next.js'. 'React'] console.log(generateFrameworkBadges(userChosenBadges))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM