如何将所有大写字母移到字符串开头?

3

我一直在练习使用我所学/已知的简单解决方案。

我遇到的问题是如何将字符串中的大写字母移到前面?

我已经解决了它,但这不符合我的预期,因为我的原始想法是:找到大写字母 → 将它们放入数组中 → 用原始字符串数组与删除其中大写字母的字符串数组连接大写字母。

因此,我的问题是,在第一个条件语句中如何去除大写字母,以便我不需要创建另一个条件语句来查找小写字母并将其存储在数组中?

例如,输入字符串是'heLLo'→ 输出应为'LLheo'(现在大写字母在前面)。

谢谢!

function capToFront(s) {
    var sp = s.split("");
    var caps = []; 
    var lower = []
    for (var i = 0; i < sp.length; i++)
        {
            if (sp[i] == sp[i].toUpperCase()){              
                caps.push(sp[i]);
           **//How can i remove the capital letter in "sp" array as I've pushed them into the caps Array**

            }
            if (sp[i] == sp[i].toLowerCase()){
                lower.push(sp[i]);
            }
        }
    return caps.join("").concat(lower.join(""));
}

提供输入数组和期望的输出数组会很有帮助! - Sivakumar Tadisetti
1
caps.push(s[i]) 之后立即执行 sp.splice(i, 1)。然后在结尾处,只需执行 ....concat(sp.join("")) 即可,无需第二个 if - Dev Yego
4个回答

7

使用RegExp,您可以在一行代码中完成目标,而无需任何循环:

const result = [...'heLLo'].sort(l => /[A-Z]/.test(l) ? -1 : 0).join('');

console.log(result); // LLheo

If you want to ensure the original order among the capital letters is preserved, it will be slightly longer:

const result = [...'Hello World Foo Bar']
  .sort((a, b) => /[A-Z]/.test(a) ? /[A-Z]/.test(b) ? 0 : -1 : 0)
  .join('');

console.log(result); // HWFBello orld oo ar


1
你好,谢谢!但是不幸的是,我一直很难理解正则表达式,因为我似乎无法掌握其基础,因此只能求助于循环的基础知识。但是,非常感谢你的答案!我会选择你的答案作为理想的解决方案。但我也很想知道如何使用splice。 - Rind
如果a是从AZ的任何字母,则/[A-Z]/.test(a)会返回true。希望这能有所帮助! - GirkovArpa

2

使用正则表达式可以通过更小的循环达到您的目标。

function capToFront(sp) {
    let upperRgx = /[A-Z]/g;
    let upperLetters = sp.match(upperRgx);
    for(let i=0; i < upperLetters.length;i++) {
        let indx = sp.indexOf(upperLetters[i]);
      sp = sp.substring(0,indx)+sp.substring(indx+1,sp.length);
    }
    sp = upperLetters.join("")+sp;
    
    return sp;
}

console.log(capToFront("heLLo")) // Output: LLheo


1
使用Splice方法进行删除。

function capToFront(s) {
    var sp = s.split("");
    var caps = []; 
    var lower = []
    for (var i = 0; i < sp.length; i++)
        {
            if (sp[i] == sp[i].toUpperCase()){              
                caps.push(sp[i]);
                // Use the `splice` method to remove
                sp.splice(i, 1);
            }
            if (sp[i] == sp[i].toLowerCase()){
                lower.push(sp[i]);
            }
        }
    console.log('sp', sp);
    return caps.join("").concat(lower.join(""));
}

console.log(capToFront("stAck"))


1
你也可以尝试这种方法,其中检查字符的ASCII值,因为大写字母位于65和90之间,然后相应地在数组上使用.sort.join方法。

function capToFront(s) {
    var sp = s.split("");
    const res = sp.sort((a,b)=> isCaps(a) ? isCaps(b) ? 0 : -1 : 0)
    return res.join("")
}

function isCaps(c){
  return c.charCodeAt()>=65 && c.charCodeAt()<=90
}

console.log(capToFront('hIsAmplEStRing'))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接