Javascript 更改字符串中的双字母

Javascript 更改字符串中的双字母,javascript,Javascript,我正在做一个函数,它可以返回一个包含单词字符的数组。它需要将一些双字母保存为数组中的一个。我有一个包含双字母的数组。我有一张很大的单词表。现在的问题是,它将第一个字母保存了2次,并从名为字母的数组中的单词中保存了双字符。函数本身在一个循环中运行,该循环从json对象获取单词。这个函数是按照我所能想到的方式制作的,但是如果有更好的方法,请告诉我如何制作 职能: var word = 'voorheen'; var doubles = ['aa', 'oo', 'ee', 'ie', 'oe', '

我正在做一个函数,它可以返回一个包含单词字符的数组。它需要将一些双字母保存为数组中的一个。我有一个包含双字母的数组。我有一张很大的单词表。现在的问题是,它将第一个字母保存了2次,并从名为字母的数组中的单词中保存了双字符。函数本身在一个循环中运行,该循环从json对象获取单词。这个函数是按照我所能想到的方式制作的,但是如果有更好的方法,请告诉我如何制作

职能:

var word = 'voorheen';
var doubles = ['aa', 'oo', 'ee', 'ie', 'oe', 'eu', 'uu', 'au', 'ou', 'ui', 'ng', 'ch',   'ij'];
var letters = getLetters(word, doubles);
console.log(letters);

function getLetters(word, doubles) { 
var letters = [];
var specials = [];
var indexes = [];
for(var s=0;s<doubles.length;s++) {
    if(word.indexOf(doubles[s]) != -1) {
        specials.push(doubles[s]); 
        indexes.push(word.indexOf(doubles[s])); 
        console.log('specials: ' + specials);           
        console.log('indexes: ' + indexes);          
    }
}   
for(var i=0;i<word.length;i++) { 
    if(specials.length>0) {
        for(var j=0;j<specials.length;j++) {
            if(i<indexes[j]) {
                letters.push(word[i]);  
                console.log('i: ' + i);
                console.log('j: ' + j);
                console.log('letter: ' + word[i]);
            }    
            if(i==indexes[j]) {
                letters.push(specials[j]);
                console.log('i: ' + i);
                console.log('j: ' + j);
                console.log('letter: ' + word[i]);                  
            }
            if(i>indexes[j] + specials[j].length) { 
                letters.push(word[i]);
                console.log('i: ' + i);
                console.log('j: ' + j);
                console.log('letter: ' + word[i]);                  
            }

        }
    }
    else {
        letters.push(word[i]);
    }       
}
return letters;
}   
虽然我想:

 ["v", "oo", "r", "h", "ee", "n"] 
正则表达式尽可能多地捕获,除非特别声明为ungreedy,因此两个字母的组合优先于。匹配任何单个字符的

奖励积分,因为这可以扩展到包括任何长度的组合:p

正则表达式尽可能多地捕获,除非特别声明为ungreedy,因此两个字母的组合优先于。匹配任何单个字符的


奖励点,因为它可以扩展到包括任何长度的组合:p

这里有一个解决方案,它应该在没有正则表达式和POJS的情况下工作

Javascript

function stringToFormattedArray(string) {
    var doubles = ['aa', 'oo', 'ee', 'ie', 'oe', 'eu', 'uu', 'au', 'ou', 'ui', 'ng', 'ch', 'ij'],
        result = [],
        chars,
        pair;

    while (string) {
        pair = string.slice(0, 2);
        if (doubles.indexOf(pair) !== -1) {
            result.push(pair);
            string = string.slice(2);
        } else {
            result.push(pair.split("")[0]);
            string = string.slice(1);
        }
    }

    return result;
}

console.log(stringToFormattedArray("voorheen"));
function stringToFormattedArray(string) {
    var doubles = ['aa', 'oo', 'ee', 'ie', 'oe', 'eu', 'uu', 'au', 'ou', 'ui', 'ng', 'ch', 'ij'],
        length = doubles.length,
        result = [],
        chars,
        pair,
        i;

    while (string) {
        pair = string.slice(0, 2);

        i = 0;
        while (i < length) {
            if (pair === doubles[i]) {
                result.push(pair);
                string = string.slice(2);
                break;
            }

            i += 1;
        }

        if (i === length) {
            result.push(pair.split("")[0]);
            string = string.slice(1);
        }
    }

    return result;
}

console.log(stringToFormattedArray("voorheen"));
输出

["v", "oo", "r", "h", "ee", "n"]

注:可以通过MDN上提供的垫片或通过。当然,您也可以手动循环数组并执行===

更新:不带Array.prototype.indexOf

Javascript

function stringToFormattedArray(string) {
    var doubles = ['aa', 'oo', 'ee', 'ie', 'oe', 'eu', 'uu', 'au', 'ou', 'ui', 'ng', 'ch', 'ij'],
        result = [],
        chars,
        pair;

    while (string) {
        pair = string.slice(0, 2);
        if (doubles.indexOf(pair) !== -1) {
            result.push(pair);
            string = string.slice(2);
        } else {
            result.push(pair.split("")[0]);
            string = string.slice(1);
        }
    }

    return result;
}

console.log(stringToFormattedArray("voorheen"));
function stringToFormattedArray(string) {
    var doubles = ['aa', 'oo', 'ee', 'ie', 'oe', 'eu', 'uu', 'au', 'ou', 'ui', 'ng', 'ch', 'ij'],
        length = doubles.length,
        result = [],
        chars,
        pair,
        i;

    while (string) {
        pair = string.slice(0, 2);

        i = 0;
        while (i < length) {
            if (pair === doubles[i]) {
                result.push(pair);
                string = string.slice(2);
                break;
            }

            i += 1;
        }

        if (i === length) {
            result.push(pair.split("")[0]);
            string = string.slice(1);
        }
    }

    return result;
}

console.log(stringToFormattedArray("voorheen"));


更新:出于纯粹的兴趣,我创建了一个测试正则表达式版本与上面针对特定字符串vorheen的测试

Javascript

function stringToFormattedArray(string) {
    var doubles = ['aa', 'oo', 'ee', 'ie', 'oe', 'eu', 'uu', 'au', 'ou', 'ui', 'ng', 'ch', 'ij'],
        result = [],
        chars,
        pair;

    while (string) {
        pair = string.slice(0, 2);
        if (doubles.indexOf(pair) !== -1) {
            result.push(pair);
            string = string.slice(2);
        } else {
            result.push(pair.split("")[0]);
            string = string.slice(1);
        }
    }

    return result;
}

console.log(stringToFormattedArray("voorheen"));
function stringToFormattedArray(string) {
    var doubles = ['aa', 'oo', 'ee', 'ie', 'oe', 'eu', 'uu', 'au', 'ou', 'ui', 'ng', 'ch', 'ij'],
        length = doubles.length,
        result = [],
        chars,
        pair,
        i;

    while (string) {
        pair = string.slice(0, 2);

        i = 0;
        while (i < length) {
            if (pair === doubles[i]) {
                result.push(pair);
                string = string.slice(2);
                break;
            }

            i += 1;
        }

        if (i === length) {
            result.push(pair.split("")[0]);
            string = string.slice(1);
        }
    }

    return result;
}

console.log(stringToFormattedArray("voorheen"));
输出

["v", "oo", "r", "h", "ee", "n"]

注:可以通过MDN上提供的垫片或通过。当然,您也可以手动循环数组并执行===

更新:不带Array.prototype.indexOf

Javascript

function stringToFormattedArray(string) {
    var doubles = ['aa', 'oo', 'ee', 'ie', 'oe', 'eu', 'uu', 'au', 'ou', 'ui', 'ng', 'ch', 'ij'],
        result = [],
        chars,
        pair;

    while (string) {
        pair = string.slice(0, 2);
        if (doubles.indexOf(pair) !== -1) {
            result.push(pair);
            string = string.slice(2);
        } else {
            result.push(pair.split("")[0]);
            string = string.slice(1);
        }
    }

    return result;
}

console.log(stringToFormattedArray("voorheen"));
function stringToFormattedArray(string) {
    var doubles = ['aa', 'oo', 'ee', 'ie', 'oe', 'eu', 'uu', 'au', 'ou', 'ui', 'ng', 'ch', 'ij'],
        length = doubles.length,
        result = [],
        chars,
        pair,
        i;

    while (string) {
        pair = string.slice(0, 2);

        i = 0;
        while (i < length) {
            if (pair === doubles[i]) {
                result.push(pair);
                string = string.slice(2);
                break;
            }

            i += 1;
        }

        if (i === length) {
            result.push(pair.split("")[0]);
            string = string.slice(1);
        }
    }

    return result;
}

console.log(stringToFormattedArray("voorheen"));


更新:出于纯粹的兴趣,我创建了一个测试正则表达式版本与上面针对特定字符串vorheen的测试。

好吧,在你对特例的迭代中,如果它不在当前索引中,你每次都在推送字母[j]。因为你们的特价商品有两名会员,所以每封信都会加倍

为了解决这个问题,您需要一个标志,在循环过程中设置当前字母是否应该被按下。顺便说一句,你的指数方法是有缺陷的,因为它不能处理重复的双打,例如oohoo。更好:


嗯,在你对特价的迭代中,如果不是在当前的索引中,你每次都在推这些字母[j]。因为你们的特价商品有两名会员,所以每封信都会加倍

为了解决这个问题,您需要一个标志,在循环过程中设置当前字母是否应该被按下。顺便说一句,你的指数方法是有缺陷的,因为它不能处理重复的双打,例如oohoo。更好:


我想你也把事情弄得太复杂了

请尝试以下方法:


我想你也把事情弄得太复杂了

请尝试以下方法:



你想要什么是输入,什么是输出?因为如果jquery可以更容易地创建满足我需要的函数,那么使用jquery就没有问题。如果你的doubles数组中有一个“rh”呢?它会最终输出[v,oo,rh,ee,n]?@VJD输入是上述函数中的一个字,它是voorhee和一个带有双字母的数组。输出应该如上所述。@c.O.u1是的,这正是我想要得到的。输入是什么,你想要什么输出?因为如果jquery可以更容易地创建满足我需要的函数,那么我使用jquery没有问题。如果你的doubles数组中有一个“rh”呢?它会最终输出[v,oo,rh,ee,n]?@VJD输入是上述函数中的一个字,它是voorhee和一个带有双字母的数组。输出应如上所述。@c.O.u1是的,这正是我试图获得的。捕获组是不必要的,并且在匹配空单词后不要忘记尾随| |[]捕获组是不必要的,并且不要忘记尾随| |[]在对空单词进行匹配尝试后,这取决于浏览器是否知道Array.prototype.indexOf,这对于旧版本的IE是不正确的。在这种情况下,您可以使用jQuery.inarayaa、arr。当然,jQuery是所有问题的答案。特别是当有一个无限简单的解决方案依赖于浏览器了解Array.prototype.indexOf时,这对于IE的旧版本来说是不正确的。在这种情况下,您可以使用jQuery.inarayaa,arr。因为,当然,jQuery是所有问题的答案。特别是当有一个无限简单的解决方案