1

単語の文字を含む配列を返すことができる関数を作成しています (作成しようとしています)。いくつかの二重文字を配列に 1 つとして保存する必要があります。二重文字を含む配列があります。私は単語のリストを持っています(時には大きい)。ここでの問題は、最初の文字を 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;
}   

文字のChromeログ出力:

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

私が欲しい間:

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

4 に答える 4

1

これは、正規表現なしで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"));

出力

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

jsfiddleについて

注: Array.prototype.indexOfは、MDN で提供されているものまたはes5_shimのいずれかによってシミングできます。またはもちろん、配列を手動でループして実行することもできます===

更新:なしArray.prototype.indexOf

Javascript

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

jsfiddleについて

更新: 純粋な関心のために、特定の文字列「vorheen」について正規表現バージョンと上記のバージョンをテストするjsperfを作成しました。

于 2013-06-20T16:12:20.873 に答える