2017-08-13 9 views
1

を指向質問です:実装スプリット()メソッドは、ここではJavascriptの2N版

がString()コンストラクタが存在しなかった想像してみてください。可能な限りString()のように機能するコンストラクタ 関数MyString()を作成します。 組み込みの文字列メソッドまたはプロパティ を使用することはできません。String()は存在しません。私はどのようにその機能を実装する方法を再作成する分割方法、に見当もつかないがコンストラクタを作成し

:あなたはあなたのコンストラクタをテスト にこのコードを使用することができます。だから今、あなたが行うことができます

MyString.prototype.split = function(splitter){ 
    var tmp="", result = []; 
    for(var i = 0; i < this.length; i++){ 
    for(var offset = 0; offset < this.length && offset < splitter.length;offset++){ 
    if(this[i+offset] !== splitter[offset]) break; 
    } 
    if(offset === splitter.length){ 
    result.push(tmp); 
    tmp=""; 
    i += offset -1; 
    }else{ 
    tmp+=this[i]; 
    } 
} 
result.push(tmp); 
return result; 
}; 

:あなたはsplitメソッドを実装する方法のアイデアを与えることができれば

、私は

function MyString(str) { 
 
    var thisObj = this; 
 
    var innerLength = 0; 
 
    this.length; 
 

 
    function updateLength() { 
 
    innerLength = 0; 
 
    for (var i = 0; str[i] != undefined; i++) { 
 
     innerLength++; 
 
     thisObj[i] = str[i]; 
 
    } 
 
    thisObj.length = innerLength; 
 
    } 
 
    updateLength(); 
 
    this.toString = function() { 
 
    return str; 
 
    } 
 

 
    this.charAt = function(i) { 
 
    if (isNaN(parseInt(i))) { 
 
     return this[0] 
 
    } else { 
 
     return this[i] 
 
    } 
 
    } 
 

 
    this.concat = function(string) { 
 
    str += string; 
 
    updateLength(); 
 
    } 
 

 
    this.slice = function(start, end) { 
 
    var slicedString = ""; 
 
    if (start >= 0 && end >= 00) { 
 
     for (start; start < end; start++) { 
 
     slicedString += str[start]; 
 
     } 
 
    } 
 
    return slicedString; 
 
    } 
 

 
    this.reverse = function() { 
 
    var arr = str.split(""); 
 
    arr.reverse(); 
 
    var reversedString = "", 
 
     i; 
 
    for (i = 0; i < arr.length; i++) { 
 
     reversedString += arr[i]; 
 
    } 
 
    return reversedString; 
 
    } 
 
} 
 
var ms = new MyString("Hello, I am a string") 
 
console.log(ms.reverse())

+0

別にJAVAあることから、ここで使用するための答えは次のとおりです。https://stackoverflow.com/questions/2939691/i-want-to-split-string-without -using-split-function – mplungjan

+0

'.equals'メソッドを追加します。それと 'slice'とループを使うと、' split'を簡単に実装できるはずです。 – Bergi

答えて

0

反復感謝と検索のようになります。

new MyString("testtest").split("t") //['','es','','','es',''] 

In action

+0

OPのコードをコピーして、その機能に実装するのはなぜですか? – mplungjan

+0

@mplungjanなぜか?これをopsコードに追加すると... –

+0

これは同じテクニックではありません。 – mplungjan

0

あなたは配列に文字列を変換し、Array.prototypeRegExp.prototypeメソッドを使用することができます。

this.split = function(re) { 
    var arr = Array.prototype.slice.call(this.toString()); 
    if (re === "") { 
     return arr 
    } 
    if (re === " ") { 
     return arr.filter(function(el) { 
     return /[^\s]/.test(el) 
     }) 
    } 
    if (/RegExp/.test(Object.getPrototypeOf(re).constructor)) { 
     var regexp = re.source; 
     return arr.filter(function(el) { 
     return regexp.indexOf(el) === -1 
     }) 
    } 
    } 

function MyString(str) { 
 
    var thisObj = this; 
 
    var innerLength = 0; 
 
    this.length; 
 

 
    function updateLength() { 
 
    innerLength = 0; 
 
    for (var i = 0; str[i] != undefined; i++) { 
 
     innerLength++; 
 
     thisObj[i] = str[i]; 
 
    } 
 
    thisObj.length = innerLength; 
 
    } 
 
    updateLength(); 
 
    this.toString = function() { 
 
    return str; 
 
    } 
 
    
 
    this.split = function(re) { 
 
    var arr = Array.prototype.slice.call(this.toString()); 
 
    if (re === "") { 
 
     return arr 
 
    } 
 
    if (re === " ") { 
 
     return arr.filter(function(el) { 
 
     return /[^\s]/.test(el) 
 
     }) 
 
    } 
 
    if (/RegExp/.test(Object.getPrototypeOf(re).constructor)) { 
 
     var regexp = re.source; 
 
     return arr.filter(function(el) { 
 
     return regexp.indexOf(el) === -1 
 
     }) 
 
    } 
 
    } 
 

 
    this.charAt = function(i) { 
 
    if (isNaN(parseInt(i))) { 
 
     return this[0] 
 
    } else { 
 
     return this[i] 
 
    } 
 
    } 
 

 
    this.concat = function(string) { 
 
    str += string; 
 
    updateLength(); 
 
    } 
 

 
    this.slice = function(start, end) { 
 
    var slicedString = ""; 
 
    if (start >= 0 && end >= 00) { 
 
     for (start; start < end; start++) { 
 
     slicedString += str[start]; 
 
     } 
 
    } 
 
    return slicedString; 
 
    } 
 

 
    this.reverse = function() { 
 
    var arr = str.split(""); 
 
    arr.reverse(); 
 
    var reversedString = "", 
 
     i; 
 
    for (i = 0; i < arr.length; i++) { 
 
     reversedString += arr[i]; 
 
    } 
 
    return reversedString; 
 
    } 
 
} 
 
var ms = new MyString("Hello, I am a string") 
 
console.log(ms.split(""), ms.split(" "), ms.split(/l/))

+1

なぜですか? [] .filter.call(this)もうまくいくでしょう... –

+0

@Jonaswあなたは正しいですか? '.call()'を使うことを考えなかった – guest271314

関連する問題