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

How to move all capital letters to the beginning of the string?

我一直在使用我一直在学习/知道的东西来练习简单的解决方案。 我遇到的问题是,如何将字符串中的大写字母移到前面?

我已经解决了,但是这不是我的期望,因为我最初的想法是→找到大写字母→将它们放入一个数组→将大写字母与原始字符串数组连接,并删除大写字母.

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

例如,输入字符串是'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(""));
}

使用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"))

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

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

console.log(result); // LLheo

如果要保证大写字母之间的顺序不变,会稍微长一点:

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

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

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

您也可以尝试这种方法,检查字符的 ASCII 值,因为大写字母位于 65 and 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'))