2016-10-29 9 views
0

私はコードワークで演習を行っていますが、コードはテストに合格しますが、typeErrorを返します。理由を理解できませんでした。私はいくつかの助けを得ることができれば素晴らしい...ありがとう!タイプエラー:オブジェクトに分割方法がありません

タスクは、任意の文字列を取ることができ、単語の最初と最後の文字をそのまま残しながら、各単語内の文字をランダムに突き止めることができる関数を作成することです。ここで

は私のコードです:

function shuffle(a) { 
    var j, x, i; 
    for (i = a.length; i; i--) { 
     j = Math.floor(Math.random() * i); 
     x = a[i - 1]; 
     a[i - 1] = a[j]; 
     a[j] = x; 
    } 
}; 

mixwords = function(string){ 

    var array = string.split(" "); 

    for (var i = 0; i < array.length; i++) { 
    var itemArray = array[i].split(""); 
    if (itemArray.length > 2) { 
     var first = itemArray.shift(); 
     var last = itemArray.pop(); 

     shuffle(itemArray); 
     itemArray.unshift(first); 
     itemArray.push(last); 
     var newItem = itemArray.join(""); 
     array[i] = newItem; 
    } 
    }; 
    console.log(array.join(" ")); 
    return array.join(" "); 
}; 

エラーメッセージは次のようになります:

TypeError: Object 23 has no method 'split' at mixwords

/runner/frameworks/javascript/cw-2.js:273

throw ex; ^

+0

どのように我々は知っていることになっていますか?私はあなたが何かを呼び出すことさえ見ません。 – PHPglue

+0

あなたは何かが 'String'型であると仮定しています。これは' .split'メソッドを持ちますが、何かが 'Number'型であると仮定しています。 23行はどちらですか? –

+0

PHPglue、申し訳ありませんが、私は最後に関数を呼び出さなかったのは、コードがテストに合格したからです。ちょうどあなたのために:mixwords( "冬が来ている"); – yangmei

答えて

0

あなたは、本質的にそれがのだ場合には、stringパラメータとして関数に渡されるものは何でもサニタイズする必要がありますNumberタイプ。あなたはパラメータがstringでない場合は、単純にすぐに復帰する必要がある場合は

mixwords = function(string){ 
    string = typeof string !== 'string' ? string.toString() : string; 
    var array = string.split(" "); 

    for (var i = 0; i < array.length; i++) { 
    var itemArray = array[i].split(""); 
    if (itemArray.length > 2) { 
     var first = itemArray.shift(); 
     var last = itemArray.pop(); 

     shuffle(itemArray); 
     itemArray.unshift(first); 
     itemArray.push(last); 
     var newItem = itemArray.join(""); 
     array[i] = newItem; 
    } 
    }; 
    console.log(array.join(" ")); 
    return array.join(" "); 
}; 

あるいは、これは解決策のようになります。

mixwords = function(string){ 
    if (typeof string !== 'string') return; // just 'return' to return 'undefined' 

    var array = string.split(" "); 

    for (var i = 0; i < array.length; i++) { 
    var itemArray = array[i].split(""); 
    if (itemArray.length > 2) { 
     var first = itemArray.shift(); 
     var last = itemArray.pop(); 

     shuffle(itemArray); 
     itemArray.unshift(first); 
     itemArray.push(last); 
     var newItem = itemArray.join(""); 
     array[i] = newItem; 
    } 
    }; 
    console.log(array.join(" ")); 
    return array.join(" "); 
}; 
+0

ありがとうございますamdouglas、非常に役立ちますが、1つのテストに失敗し、エラーメッセージが表示されます:✘予想:未定義、代わりに: '23'。ここにいくつかのテストがあります:Test.assertEquals(mixwords(23)、undefined); Test.assertEquals(mixwords(true)、undefined);変数stringが文字列でない場合は、未定義に戻す必要がありますか? – yangmei

+0

だから、文字列に変換するのではなく、文字列が 'string'型であるかどうかをチェックする必要があります。このように:if(typeof string!== 'string'){return; } ' – amdouglas

+0

恐ろしい!合格すべてのテストはエラーなし。ありがとうございました! – yangmei

関連する問題