String.prototype.split2dについて

このQ&Aのポイント
  • String.prototype.split2d関数について理解することができません。
  • アクションスクリプトを独学している中で、String.prototype.split2dというコードを見つけましたが、その使い方や意味がわかりません。
  • 検索しても情報が見つからず、どなたか教えていただけないでしょうか?また、String.prototype.split2d関数はどのような場面で使われるのでしょうか?
回答を見る
  • ベストアンサー

String.prototype.split2d 理解できません

皆様、いつもお世話になります。 今、アクションスクリプトを独学しています。 String.prototypeに関して調べる途中 このサイトで http://www.actionscript.org/forums/showthread.php3?p=22798 以下のようなコードを見ましたが、、、 String.prototype.split2d = function () { tmpAr = this.split("|"); for (j=0; j<tmpAr.length; j++) { tmpAr[j] = tmpAr[j].split(","); } return tmpAr }; myString = "1,2,3,4|5,6,7,8|9,10,11,12"; tmp = myString.split2d(); trace(tmpAr[0][0]); split2dはなんですか? 検索して見ても当たる情報もないし、、何方か教えていただきませんか? あと、String.prototype.split2d = function はいつよく使われますか? ぜひ、よろしくお願いいたします。

  • Flash
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.3

ご質問のスクリプトですが, 普通の書き方にすると次のようになります。 ------------------------------- split2d = function (str) { tmpAr = str.split("|"); for (j=0; j<tmpAr.length; j++) { tmpAr[j] = tmpAr[j].split(","); } return tmpAr; }; myString = "1,2,3,4|5,6,7,8|9,10,11,12"; tmp = split2d(myString); trace(tmp[0][0]); -------------------------------  ↓型指定を入れた方がわかり易い?↓ ------------------------------- split2d = function (str:String):Array { var tmpAr:Array = str.split("|"); for (var j:Number=0; j<tmpAr.length; j++) { tmpAr[j] = tmpAr[j].split(","); } return tmpAr; }; var myString:String = "1,2,3,4|5,6,7,8|9,10,11,12"; var tmp:Array = split2d(myString); trace(tmp[0][0]); ------------------------------- 上が ActionScript 1.0 風で 下が ActionScript 2.0 風です。 これを  あえて普通ではない,  Stringクラスの拡張メソッドもどき的な書き方をすると,  ご質問のようなう書き方もできますよ。 ということでしょう。 普通は上で書いたようにするので, ご質問のスクリプト自体には全く有り難みを感じませんが, ご質問の "スクリプト自体が重要" なのではなく,  このような書き方をすると何かの時に使えるかもしれませんね。 という "スクリプトの可能性" を書いているのだと思います。 > split2dはなんですか? 作者が勝手に作った(命名した),メソッド名(匿名関数参照の変数名)です。 以下は,#2の方が書かれていらっしゃる内容と同じでが。 ・ご質問のスクリプトの訂正  trace(tmpAr[0][0]);    ↓訂正↓  trace(tmp[0][0]); ・補足内容の訂正 > //結果をtmpArにreturn > return tmpAr  ↓訂正↓ //できた配列 tmpAr を return(戻り値として返す) return tmpAr  

karisuma79
質問者

お礼

BlurFiltan様、ご回答ありがとうございます!!! 普通の書き方だとこうですか、、、 本当に、勉強になりました。 ありがとうございました!

その他の回答 (2)

回答No.2

ただの日本語間違い?かと思いますが 結果をtmpArにreturn というよりは 結果のtmpArをreturn というべきかと ところでいま気付いたんですが trace(tmpAr[0][0]); ってほんとは trace(tmp[0][0]); って書きたかったんじゃないですかね? でないとなんのためにtmpにsplip2dの 戻り値代入したん?ってカンジです まあ多分結果はおんなじ?だと思うんですが・・・

karisuma79
質問者

お礼

H240S18B73様、ご回答ありがとうございます!! 良い、参照になりました。 これからもよろしくお願いします。

回答No.1

Stringクラスはdynamicクラスじゃないから 後からプロパティやメソッドを追加できないし かといってfinalクラスなんでクラスの拡張もできないから クラスにメソッド追加したかったら 大元の継承元のObject、prototypeに書いちゃおうという話 これでStringクラスに"|"と","で文字列を2次元(2D)配列にしちゃう split2dメソッドなんて機能追加しちゃうよ、ってカンジですね

karisuma79
質問者

補足

H240S18B73様、ご回答ありがとうございます。 100%理解できたとは断言できませんが、 なるほど、、っていう感じです。 2次元(2D)配列の配列をするから、split2dで、2dがありますね。 ありがとうございました。 一行ずつコード分析すると、、 //メソッド追加 String.prototype.split2d = function () { //これを|で配列にして、tmpArに代入、tmpArは配列、、 tmpAr = this.split("|"); //配列の要素個数を利用し、2次元配列にする。 for (j=0; j<tmpAr.length; j++) { tmpAr[j] = tmpAr[j].split(","); } //結果をtmpArにreturn return tmpAr }; myString = "1,2,3,4|5,6,7,8|9,10,11,12"; tmp = myString.split2d(); trace(tmpAr[0][0]); 間違いところがありましたら、指摘よろしくお願いいたします。

関連するQ&A

  • VBAでSplitエラーです

    環境:Excel2002です   Cells(1, 1)に(1)~(10),(13),(20)~(28)のような値があります   Cells(1, 1)の値は別のプロシージャ求めていてその都度変わります   Cells(j, 4)をスタート位置にして   Cells(j, 4)に(1)~(10)   Cells(j+1, 4)に(13)   Cells(j+2, 4)に(20)~(28)を表示したいので   以下のプロシージャにしました Dim Str As String Str = ActiveSheet.Cells(1, 1).Value Dim i As Integer Dim j As Integer '◆カンマで区切った文字列をD列に格納 Dim tmp As Variant tmp = Split(Str, ",") j = 1 For i = 0 To UBound(tmp) ActiveSheet.Cells(j, 4) = tmp(i) j = j + 1 Next i   あるブックでは正常に動作するのですが   別のブックでは以下のエラーメッセージがでて動作しません   【モジュールではなく、変数またはプロシージャを指定してください】   何が原因なのでしょうか?ご教示願います   Splitを使わない別の方法があればそれでも結構です   とにかく困っています

  • トリッキーなJSの文法(prototype.jsなど)が分かりません

    Ajaxの「prototype」( http://www.prototypejs.org/ )などで 下記のようなfunctionの記述方法をよく見かけます。 ▼Prototype.js(ver1.5.0) 20行目抜粋 ---------------------------------------- var Class = {  create: function() {   return function() {    this.initialize.apply(this, arguments);   }  } } -------------------------------------------- でも、私には高度すぎて以下の点がどうしても読み解けません。  (1)var Class = {~~~~~~} が、何をしているのか分かりません。    配列なら[ ]ですし関数か何かを省略した宣言の記述方法なのでしょうか?  (2)create: が何なのか分かりません。必死で調べたら型を宣言しているような感じでしたが、    見慣れない「:」を使ったプログラムで検討もつきません。 私が知っているfunction宣言はこの2パターンのみしか知りません。 ・一般的なfunction宣言  function test(hikisu){   //処理内容  } ・無名関数でのfunction宣言  var a = function(x) {   //処理内容  } ぜひ教えていただけませんでしょうか。 どうぞよろしくお願いします。

  • js プロトタイプ

    javascriptソースコード <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" /> <title>サンプル</title> </head> <body> <script type="text/javascript" src="jquery-1.7.2.min.js"></script> <script src="fastclick.js"></script> <script> function print(str){ document.write(str + "<br />"); } function Car(manufact, name){ this.manufact = manufact; this.name = name; } Car.prototype.info = function(){return this.manufact + " " + this.name;}; document.write("<p>"); var car1 = new Car("Toyota", "PRIUS"); print(car1.info()); var car2 = new Car("Honda", "INSIGHT"); print(car2.info()); document.write("</p>"); </script> </body> </html> 23行目なのですが「 Car.prototype.info 」とありますがjsにおいてプロトタイプはオブジェクトだという事は認識しておりますがプロトタイプを宣言する意味は何があるのでしょうか? 参考urlです。 http://www.ajaxtower.jp/js/function_class/index3.html

  • VBA(Excel2003)で文字列の切り出し

    下のプロシージャーで全角半角混じりの文字列を切り出し、別の文字列で結合しようと思いますがうまくいく場合といかない場合があります。 イミディエイト・ウィンドウ上とCell上で動作が違います。 Cell上でうまく表示させるにはどうしたらいいでしょうか? Sub Test() Dim myString(2) As String Dim i As Integer myString(0) = "airueo" myString(1) = "かきくけこ" myString(2) = "さシすせそ" For i = 0 To 2 Debug.Print MidMbcs(myString(i), 1, 5) & "...テスト" Cells(i + 1, 1).Value = MidMbcs(myString(i), 1, 5) & "...テスト" Next i End Sub Function LenMbcs(ByVal str As String) LenMbcs = LenB(StrConv(str, vbFromUnicode)) End Function Function MidMbcs(ByVal str As String, start, length) MidMbcs = StrConv(MidB(StrConv(str, vbFromUnicode), start, length), vbUnicode) End Function

  • Array.prototype は使用しない方がいい?

    prototypeの有名な問題にobjentオブジェクト汚染、Arrayオブジェクト汚染があると思います。 - 現在ブラウザに実装されているJavaScriptにはforEachがない - forEachの代替としてfor~inが使われている - for~in はオブジェクトのプロパティを列挙する - forEachの代替としてfor~inが使われる事を考慮して、object.prototype は使用すべきではない Object オブジェクトの prototype に便利メソッドを放り込むのはやめて頂きたい - nazonoDiary http://d.hatena.ne.jp/nazoking/20050425/1114374966 for...in - MDC https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Statements/for...in この理屈はわかります。 一方、Array.prototype はなぜ使用してはいけないのでしょうか? ---- // 数値添字配列 Array.prototype.test=function(){ return 'test'; }; var arr = [1,3,5,7,9]; for(var i=0,l=arr.length; i<l; i++){ console.info(arr[i]); // コンソール出力(要Firebug) } // オブジェクト (連想配列ではない) Array.prototype.test=function(){ return 'test'; }; var arr = { a:1,b:3,c:5,d:7,e:9 }; for(var i in test){ console.info(test[i]); // コンソール出力(要Firebug) } ---- どちらも問題なく動作します。 問題が発生するとすれば「数値添字配列でfor~inを使用するケース」ですが、それは実装が誤っていると思います。 for~inはオブジェクトのプロパティを列挙する仕組みなので、prototypeで拡張したプロパティまで列挙されるのは自然な動作です。 私はこれを「for~inバグ」と呼ばれることに違和感を覚えるのですが…。 「数値添字配列でfor~inを使用するライブラリがとても多いから、Array.prototype は止めよう」ということなのでしょうか? JavaScript の Array オブジェクトを汚染させずに拡張してみる - Cyokodog::Diary http://d.hatena.ne.jp/cyokodog/20081031/ArrayExtend01

  • 例外処理の書き方がよく分かりません。

    例外処理の書き方がよく分かりません。 普通に書くと↓の(2)のところでエラーが出てしまうと思うのですが、こういった場合の例外処理の書き方が分かりません。 (1)の前に、 if(s2.length == 1) return; を書けば、エラーにはならないと思います。しかし、try catchやthrowsするのが普通のような気がしており、書き方が分かりません。 String str = "inu,neko"; String str2 = "inu"; String[] s = str.split(","); String[] s2 = str2.split(","); s[1].length(); s2[1].length();//(1)

    • ベストアンサー
    • Java
  • 全角文字を半角にすると全角の”と’が変換されない理由と対策を!?

    String.prototype.toAscii = function(){ return this.replace(/([!-~ ])/g, function (char){return String.fromCharCode(char.charCodeAt(0) - 65248)} ); } タイトル通りです。全角の「”」と「’」が半角文字に変換されません。 その理由と対策を教えていただけますか? それと、根本的にこんなやりかたは、だめなのでしょうか?

  • JavaScriptのthisの挙動について

    JavaScriptで次のCodeのようなコードを書いて実行したところ、Outputのようになります。 原因は、thisが保持できていなかったからです。 ※先頭に#が付いているのが問題の箇所です。 Code: Array.prototype.rs = function() // rs = random sort { var ret = { list: new Array(), length: new Number() }; # var obj = { # list: this # }; var tmp = { index: new Number(), length: obj.list.length }; while((ret.length = ret.list.length) < tmp.length) { tmp.index = Math.floor(Math.random() * (tmp.length - ret.length)); ret.list[ret.length] = obj.list[tmp.index]; obj.list.splice(tmp.index, 1); } return ret.list; } var list = new Array(1,2,3,4,5,6,7,8,9); alert(list.rs()); alert(list.rs()); Output: アラートウィンドウで 2,4,6,9,3,5,1,8,7 (一例) アラートウィンドウで 出力無し 要するに、thisをobj.listに入れて、thisには触っていないのに、obj.listと同期してthisが消えているのです。 Code中で先頭に#を付けた部分を次のように変更すると期待通りに動作しましたが、腑に落ちません。 # var obj = { # num: this.join('') # }; # obj.list = obj.num.split(''); もっと簡潔な書き方や、迅速に動く書き方があればご教授頂きたいです。

  • Javascriptリアルタイムエラーチェック

    Javascript初心者です。 本を見ながらフォームの入力値のリアルタイムエラーチェックを実装しています。 テキストフィールドへの入力値の妥当性検証はできるのですが、 チェックボックスが一つもチェックされていなかった場合にチェックボックスを囲むfieldsetを赤くさせるのがうまくいきません。 電話番号の形式指定ならば String.prototype.isZip = function(){ return this.isEmpty()||/^\d{3}-\d{4}$/.test(this); } という形です。thisはname属性を参照します。 すべての項目にエラーがない場合に確認画面へ進めるようにしています。 String.prototype.isNotEmpty = function() { return this != ''; } String.prototype.isEmpty = function(){ return this == ''; } String.prototype.isShorterThan = function(n){ return this.length<=n; } String.prototype.isLongerThan = function(n){ return this.length >= n; } String.prototype.isZip = function(){ return this.isEmpty()||/^\d{3}-\d{4}$/.test(this); } String.prototype.isPhone = function() { return this.isEmpty()||/^\d{2,4}-\d{1,4}-\d{4}$/. test(this); } String.prototype.isEmail = function() { return this.isEmpty()||/^([\w-]+\.?)+@[\w-]+(\.([\w-]+))+$/.test(this); } var formValidation = function(name, feedback, fields){ var form = document.forms[name]; for (var i=0; i<form.elements.length; i++){ (function(){ var elm = form.elements[i]; var f = fields[elm.name]; if (f){ f.element = elm; f.process = function(){ var ok = true; if (f.convert) f.element.value = f.convert(f.element.value); if (f.validation) ok = f.validation(f.element.value); if (f.feedback) f.feedback(ok, f.element); return ok; } elm.onblur = function(e){ f.process() } } })(); } form.onsubmit = function(){ var all_ok = true; for (key in fields) if (fields[key] && !fields[key].process()) all_ok = false; return feedback(all_ok); }; } </script> <script type="text/javascript"> <!-- <![CDATA[ window.onload = function(){ var fields = { 'last_name':{ convert: function(val){ return val.cnvKana('asKV').trim() }, validation: function(val){ return val.isNotEmpty() && val.isShorterThan(16) }, feedback: function(ok, elm){elm.style.border = ok ? 'solid 2px #3CB371' : 'solid 2px f57272'; } }, 'furigana':{ convert: function(val){ return val.cnvKana('sKVC').trim() }, validation: function(val){ return val.isNotEmpty() && val.isComposedOf(cs.kata.zen+cs.space.han) && val.isShorterThan(32) }, feedback: function(ok, elm){ elm.style.border = ok ? 'solid 2px #3CB371' : 'solid 2px f57272'; } }, 'phone':{ convert: function(val){ return val.cnvPhone() }, validation: function(val){ return val.isNotEmpty() && val.isPhone() }, feedback: function(ok, elm){elm.style.border = ok ? 'solid 2px #3CB371' : 'solid 2px f57272';} } 'email':{ convert: function(val){ return val.trim() }, validation: function(val){ return val.isNotEmpty() && val.isEmail() }, feedback: function(ok, elm){ elm.style.border = ok ? 'solid 2px #3CB371' : 'solid 2px f57272';}, }, }; var feedback = function(ok){ if (ok) alert("確認画面へ進みます。"); else alert("フォームの内容に不備があるようです。再度の確認をお願いいたします。") return ok; }; new formValidation('MAINFORM', feedback, fields); } // ]]> --> <form name="MAINFORM" action="check.php" method="post"> <input name="last_name" type="text"> <input name="furigana" type="text" /> ~~~~~~ <fieldset id="checkboxDemo" name="job"> <legend><img src="images/label_kozanaiyou.gif" width="92" height="18"></legend> <label for="checkbox-1" tabindex="1">オフィス(Word,Excel)</label> <input type="checkbox" name="kouza[]" id="checkbox-1" value="オフィス(Word,Excel)" /> <label for="checkbox-2" tabindex="2">ネットワーク構築</label> <input type="checkbox" name="kouza[]" id="checkbox-2" value="ネットワーク構築" /> <label for="checkbox-3" tabindex="3">WEBデザイン</label><input type="checkbox" name="kouza[]" id="checkbox-3" value="WEBデザイン" /> <label for="checkbox-4" tabindex="4">WEBプログラミング</label> <input type="checkbox" name="kouza[]" id="checkbox-4" value="WEBプログラミング" />  </fieldset> 自分で色々と試してみましたがうまくいかず、皆様のお力を借りたいと思い投稿しました。 詳しい方教えてください。

  • FLASHでCSVを配列で読込後、読み込んだ配列を関数の外で使いたい。

    FLASHでCSVを配列で読込後、読み込んだ配列を関数の外で使いたい。 下記のスクリプトでCSVから配列を取り込みましたが、 関数の外で、「csvRows」変数の中身を見る方法が分かりません。。 var csvLoader = new LoadVars(); var theFileObj = new LoadVars(); var theFile = csvLoader.sendAndLoad("test.csv",theFileObj,GET ); var csvRows = new Array(); theFileObj.onData = function(src) { var theFileArray = src.split("\r\n").join("\n").split("\n"); var theFieldNames = theFileArray[0].split(","); var numberOfFields = theFieldNames.length; for(var j=0; j<numberOfFields; j++){ theFieldNames[j] = removeQuotes(theFieldNames[j]); } for(var i=0; i<theFileArray.length; i++){ var tempArray = theFileArray[i].split(","); csvRows.push(tempArray); } } function removeQuotes(theString){ if (theString.charAt(0) == '"' || theString.charAt(0) == "'") { return theString.substr(1, theString.length - 2); }else { return theString; } }

    • ベストアンサー
    • Flash