2016-10-07 12 views
0

これはコードワードの課題の1つで、文字列を取り、配列を返す関数を書くことになっています。連続する同一の要素。また、注文は変更しないでください。JavaScriptを使用して文字列内の連続した文字をフィルタリングする必要があります

たとえば、文字列"hhhhheeeelllloooooohhheeeyyy"を渡すと、関数はarray = ["h","e","l","o","h","e","y"]を返します。

これは私のコードです。私は文字列を渡す場合、私はjの値が増加し続けるためにそれを意図したとおり

var uniqueInOrder=function(iterable){ 
    //your code here - remember iterable can be a string or an array 
    var unique = []; 
    for(var i = 0; i < iterable.length; i++) { 
     unique.push(iterable[i]); 
    } 

    for(var j = 0, k = 1; j < unique.length; j++, k = j + 1){ 
     if(unique[j] === unique[k]){ 
     unique.splice(k,1); 
    } 
    } 
    return unique; 
} 

ので、このような"hhhhheeeeeellllloooo"としては、それゆえ私はすべて同一の要素を除外することができない、動作しません。

私はunique[j] === unique[k]の値がゼロになるたびに、そしてそうでない場合は、それらがすると思われるようにロジックが調整されるように試みました。

これは私に無限ループをもたらしました。

私はあなたの助けが必要です。あなたが唯一のユニークで最後の文字に対する反復可能なの現在のインデックスを比較する必要が

+0

データのコピーを1つだけ使用してみてください。 2つのコピーを比較しようとしていると指数を真っ直ぐに保つことは、問題を複雑にしています。追跡する必要があるのは、現在の値と次または前の値のいずれかです。現在の値がそれらのいずれかと等しい場合は、それが重複しているため1を破棄します。また、正規表現を調べることもできます。彼らはこのタイプの置き換えを1行で行うことができます。正規表現を使用し始めると、永遠にその使用法が見つかるでしょう。 – LinuxDisciple

+0

@LinuxDiscipleこんにちは、次の値または前の値を追跡するという考えが思い浮かびましたが、そのためのコードを思いつくことはできません。私はそれをもう一度試してみるでしょう。まだそれが得られなければ、私はあなたに手を差し伸べるでしょう。ありがとうございました。 –

答えて

1

for loopunique.lengthが実行中に一定ではないため失敗です。 私はあなたの問題は次のように解くことができると思う:

var temp = iterable[0]; 
unique.push(iterable[0]); 
for(var i = 1; i < iterable.length; i++) { 
    if(iterable[i] != temp) { 
     unique.push(iterable[i]); 
     temp = iterable[i]; 
    } 
} 

はそれが役に立てば幸い!

+1

最初の文字が一意であれば、それはどのように 'ユニーク'になるのでしょうか? 「私は決して0ではありません... – LinuxDisciple

+0

あなたは正しいです!だから私は思うユニークな配列に最初の一時的な温度を追加して修正することができますか? –

+0

これはうまくいくが、 'temp'は常に' unique'の最後の値と同じではないのですか? 'temp'がまったく必要ですか? – LinuxDisciple

1

function(iterable){ 
    var unique = [] 

    for(var i=0; i< iterable.length; i++){ 
    if(unique.length < 1){ 
     unique.push(iterable[i]) 
    } else if(iterable[i] !== unique[unique.length - 1]) { 
     unique.push(iterable[i]) 
    } 
    } 

    return unique 
} 
0

私は、これはあなたを助けると思う:

forループ
var word="hhhhheeeelllloooooohhheeeyyy" 
function doit(iterable){ 
    var unique = [] 
    unique[0]=iterable[0] 
    for(var i=1; i< iterable.length; i++){ 
    if(iterable[i] !== unique[unique.length - 1]) { 
     unique.push(iterable[i]) 
    } 
    } 
    return unique 
} 
alert(doit(word)) 

はunique.lengthが動的であるため、すなわちアレイに新しい要素を追加して変更されます失敗することはありません。

Internet Explorerでもテスト済みです。 ここにjsfiddleへのリンクがあります:https://jsfiddle.net/kannanore/z5gbee55/

+0

@ K.Angel7答えを編集しました。 'unique.push(iterable [0])'を追加しました。 –

0
var str = "hhhhheeeelllloooooohhheeeyyy"; 
var strLen = str.length; 
var newStr = ""; 
for(var i=0; i < strLen; i++){ 
    var chr$ = str.charAt(i); 
    //if(i==0) {newStr = chr$ }; 
    if(chr$ == str.charAt(i+1)){ 
     strLen = str.length;`enter code here` 
    }else{ 
     newStr = newStr + chr$ ; 
    } 
} 
//document.write(newStr); 
console.log(newStr); 
//Answer: helohey 
+0

私は配列を返すことになっています。しかし、私は正しい解決策を持っていますが、私はそれを指摘しなければならないと考えました。 –

関連する問題