6 Function.prototype.extend = function(baseConstructor, newPrototype){
7 // http://sourceforge.jp/projects/h58pcdgame/scm/git/GameScriptCoreLibrary/blobs/master/www/corelib/jsbase.js
8 //最初にベースクラスのプロトタイプを引き継ぐ。
10 F.prototype = baseConstructor.prototype;
11 this.prototype = new F();
14 for(var prop in newPrototype){
15 this.prototype[prop] = newPrototype[prop];
19 this.prototype.constructor = this;
21 this.base = baseConstructor;
26 Array.prototype.removeAllObject = function(anObject){
27 //Array中にある全てのanObjectを削除し、空いた部分は前につめる。
28 //戻り値は削除が一回でも実行されたかどうか
30 for(var i = 0; i < this.length; i++){
31 if(this[i] == anObject){
39 Array.prototype.removeAnObject = function(anObject){
40 //Array中にある最初のanObjectを削除し、空いた部分は前につめる。
42 for(var i = 0; i < this.length; i++){
43 if(this[i] == anObject){
50 Array.prototype.removeByIndex = function(index){
51 //Array[index]を削除し、空いた部分は前につめる。
52 this.splice(index, 1);
55 Array.prototype.intersectionWith = function(a, b, fEqualTo){
57 //fEqualToは省略可能で、評価関数fEqualTo(a[i], b[j])を設定する。
59 for(var i = 0, len = b.length; i < len; i++){
60 if(this.isIncluded(b[i], fEqualTo)){
66 Array.prototype.unionWith = function(a, b, fEqualTo){
68 //fEqualToは省略可能で、評価関数fEqualTo(a[i], b[j])を設定する。
70 for(var i = 0, len = b.length; i < len; i++){
71 if(!this.isIncluded(b[i], fEqualTo)){
75 return this.concat(r);
77 Array.prototype.isIncluded = function(obj, fEqualTo){
78 //含まれている場合は配列内のそのオブジェクトを返す
79 //fEqualToは省略可能で、評価関数fEqualTo(array[i], obj)を設定する。
80 if(fEqualTo == undefined){
81 for(var i = 0, len = this.length; i < len; i++){
87 for(var i = 0, len = this.length; i < len; i++){
88 if(fEqualTo(this[i], obj)){
95 Array.prototype.search2DLineIndex = function(column, obj, fEqualTo){
97 //array[n][column]がobjと等価になる最初の行nを返す。
98 //fEqualToは省略可能で、評価関数fEqualTo(array[n][column], obj)を設定する。
99 //該当する行がなかった場合、戻り値はundefinedとなる。
100 if(fEqualTo == undefined){
101 for(var i = 0, iLen = this.length; i < iLen; i++){
102 if(this[i] instanceof Array && this[i][column] == obj){
107 for(var i = 0, iLen = this.length; i < iLen; i++){
108 if(this[i] instanceof Array && fEqualTo(this[i][column], obj)){
115 Array.prototype.search2DObject = function(searchColumn, retvColumn, obj, fEqualTo){
116 //与えられた配列を二次元配列として解釈し
117 //array[n][searchColumn]がobjと等価になる最初の行のオブジェクトarray[n][retvColumn]を返す。
118 //fEqualToは省略可能で、評価関数fEqualTo(array[n][searchColumn], obj)を設定する。
119 //該当する行がなかった場合、戻り値はundefinedとなる。
120 if(fEqualTo == undefined){
121 for(var i = 0, iLen = this.length; i < iLen; i++){
122 if(this[i] instanceof Array && this[i][searchColumn] == obj){
123 return this[i][retvColumn];
127 for(var i = 0, iLen = this.length; i < iLen; i++){
128 if(this[i] instanceof Array && fEqualTo(this[i][searchColumn], obj)){
129 return this[i][retvColumn];
135 Array.prototype.pushUnique = function(obj, fEqualTo){
136 //値が既に存在する場合は追加しない。評価関数fEqualTo(array[i], obj)を設定することができる。
137 //結果的に配列内にあるオブジェクトが返される。
138 var o = this.isIncluded(obj, fEqualTo);
145 Array.prototype.stableSort = function(f){
146 // http://blog.livedoor.jp/netomemo/archives/24688861.html
147 // Chrome等ではソートが必ずしも安定ではないので、この関数を利用する。
149 f = function(a,b){ return a - b; };
151 for(var i = 0; i < this.length; i++){
154 this.sort.call(this, function(a,b){
157 return (a.__id__ > b.__id__) ? 1 : -1;
162 for(var i = 0;i < this.length;i++){
163 delete this[i].__id__;
166 Array.prototype.splitByArray = function(separatorList){
167 //Array中の文字列をseparatorList内の文字列でそれぞれで分割し、それらの文字列が含まれた配列を返す。
168 var retArray = new Array();
170 for(var i = 0, iLen = this.length; i < iLen; i++){
171 retArray = retArray.concat(this[i].splitByArray(separatorList));
176 Array.prototype.propertiesNamed = function(pName){
177 //Array内の各要素のプロパティpNameのリストを返す。
178 var retArray = new Array();
179 for(var i = 0, iLen = this.length; i < iLen; i++){
180 retArray.push(this[i][pName]);
184 Array.prototype.logAsHexByte = function(logfunc){
185 //十六進バイト列としてデバッグ出力する。
186 //logfuncは省略時はconsole.logとなる。
187 if(logfunc === undefined){
188 logfunc = function(s){ console.log(s); };
191 for(var i = 0, iLen = this.length; i < iLen; i++){
192 ds += ("00" + this[i].toString(16).toUpperCase()).slice(-2);
196 Array.prototype.stringAsHexByte = function(){
199 for(var i = 0, iLen = this.length; i < iLen; i++){
200 ds += ("00" + this[i].toString(16).toUpperCase()).slice(-2);
204 Array.prototype.logEachPropertyNamed = function(pname, logfunc, suffix){
205 //Arrayのすべての各要素pについて、プロパティp[pname]を文字列としてlogfuncの引数に渡して呼び出す。
206 //suffixは各文字列の末尾に追加する文字列。省略時は改行文字となる。
207 //logfuncは省略時はconsole.logとなる。
208 if(logfunc === undefined){
209 logfunc = function(s){ console.log(s); };
211 if(suffix === undefined){
214 for(var i = 0, iLen = this.length; i < iLen; i++){
215 logfunc(this[i][pname] + suffix);
218 Array.prototype.copy = function(){
219 return (new Array()).concat(this);
223 String.prototype.replaceAll = function(org, dest){
224 //String中にある文字列orgを文字列destにすべて置換する。
225 //http://www.syboos.jp/webjs/doc/string-replace-and-replaceall.html
226 return this.split(org).join(dest);
228 String.prototype.compareLeftHand = function (search){
230 for(var i = 0; search.charAt(i) != ""; i++){
231 if(search.charAt(i) != this.charAt(i)){
237 String.prototype.splitByArray = function(separatorList){
238 //リスト中の文字列それぞれで分割された配列を返す。
239 //separatorはそれ以前の文字列の末尾に追加された状態で含まれる。
240 //"abcdefg".splitByArray(["a", "e", "g"]);
241 // = ["a", "bcde", "fg"]
242 var retArray = new Array();
245 for(var i = 0; i < separatorList.length; i++){
246 var tmpArray = new Array();
247 for(var k = 0; k < retArray.length; k++){
248 tmpArray[k] = retArray[k].split(separatorList[i]);
249 if(tmpArray[k][tmpArray[k].length - 1] == ""){
250 tmpArray[k].splice(tmpArray[k].length - 1, 1);
251 if(tmpArray[k] && tmpArray[k].length > 0){
252 for(var m = 0; m < tmpArray[k].length; m++){
253 tmpArray[k][m] += separatorList[i];
257 for(var m = 0; m < tmpArray[k].length - 1; m++){
258 tmpArray[k][m] += separatorList[i];
262 retArray = new Array();
263 retArray = retArray.concat.apply(retArray, tmpArray);
266 if(retArray.length == 0){
267 // https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split
268 //文字列が空であるとき、split メソッドは、空の配列ではなく、1 つの空文字列を含む配列を返します。
275 String.prototype.splitByArraySeparatorSeparated = function(separatorList){
276 //リスト中の文字列それぞれで分割された配列を返す。
277 //separatorも分割された状態で含まれる。
278 //"abcdefg".splitByArraySeparatorSeparated(["a", "e", "g"]);
279 // = ["a", "bcd", "e", "f", "g"]
280 var retArray = new Array();
283 for(var i = 0; i < separatorList.length; i++){
284 var tmpArray = new Array();
285 for(var k = 0; k < retArray.length; k++){
286 var tmpArraySub = retArray[k].split(separatorList[i]);
287 tmpArray[k] = new Array();
288 for(var m = 0, mLen = tmpArraySub.length - 1; m < mLen; m++){
289 if(tmpArraySub[m] != ""){
290 tmpArray[k].push(tmpArraySub[m]);
292 tmpArray[k].push(separatorList[i]);
294 if(tmpArraySub[tmpArraySub.length - 1] != ""){
295 tmpArray[k].push(tmpArraySub[m]);
298 retArray = new Array();
299 retArray = retArray.concat.apply(retArray, tmpArray);
302 if(retArray.length == 0){
303 // https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split
304 //文字列が空であるとき、split メソッドは、空の配列ではなく、1 つの空文字列を含む配列を返します。
311 String.prototype.splitByArraySeparatorSeparatedLong = function(separatorList){
312 //リスト中の文字列それぞれで分割された配列を返す。
313 //separatorも分割された状態で含まれる。
314 //separatorListの前の方にあるseparatorは、後方のseparatorによって分割されない。
315 //"abcdefgcdefg".splitByArraySeparatorSeparatedLong(["bcde", "cd", "f"]);
316 // = ["a", "bcde", "f", "g", "cd", "e", "f", "g"]
317 //"for (i = 0; i != 15; i++) {".splitByArraySeparatorSeparatedLong(["!=", "(", ")", "="]);
318 // = ["for ", "(", "i ", "=", " 0; i ", "!=", " 15; i++", ")", " {"]
319 var retArray = new Array();
320 var checkArray = new Array();
322 checkArray[0] = false;
324 for(var i = 0; i < separatorList.length; i++){
325 var tmpArray = new Array();
326 var tmpCheckArray = new Array();
327 for(var k = 0; k < retArray.length; k++){
329 var tmpArraySub = retArray[k].split(separatorList[i]);
330 tmpArray[k] = new Array();
331 tmpCheckArray[k] = new Array();
332 for(var m = 0, mLen = tmpArraySub.length - 1; m < mLen; m++){
333 if(tmpArraySub[m] != ""){
334 tmpArray[k].push(tmpArraySub[m]);
335 tmpCheckArray[k].push(false);
337 tmpArray[k].push(separatorList[i]);
338 tmpCheckArray[k].push(true);
340 if(tmpArraySub[tmpArraySub.length - 1] != ""){
341 tmpArray[k].push(tmpArraySub[m]);
342 tmpCheckArray[k].push(false);
345 tmpArray.push([retArray[k]]);
346 tmpCheckArray.push([true]);
349 retArray = new Array();
350 checkArray = new Array();
351 retArray = retArray.concat.apply(retArray, tmpArray);
352 checkArray = checkArray.concat.apply(checkArray, tmpCheckArray);
355 if(retArray.length == 0){
356 // https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/split
357 //文字列が空であるとき、split メソッドは、空の配列ではなく、1 つの空文字列を含む配列を返します。
364 String.prototype.trim = function(str){
365 return this.replace(/^[ ]+|[ ]+$/g, "").replace(/\n$/g, "");
367 //http://d.hatena.ne.jp/favril/20090514/1242280476
368 String.prototype.isKanjiAt = function(index){
369 var u = this.charCodeAt(index);
370 if( (0x4e00 <= u && u <= 0x9fcf) || // CJK統合漢字
371 (0x3400 <= u && u <= 0x4dbf) || // CJK統合漢字拡張A
372 (0x20000 <= u && u <= 0x2a6df) || // CJK統合漢字拡張B
373 (0xf900 <= u && u <= 0xfadf) || // CJK互換漢字
374 (0x2f800 <= u && u <= 0x2fa1f)){ // CJK互換漢字補助
379 String.prototype.isHiraganaAt = function(index){
380 var u = this.charCodeAt(index);
381 if(0x3040 <= u && u <= 0x309f){
386 String.prototype.isKatakanaAt = function(index){
387 var u = this.charCodeAt(index);
388 if(0x30a0 <= u && u <= 0x30ff){
393 String.prototype.isHankakuKanaAt = function(index){
394 var u = this.charCodeAt(index);
395 if(0xff61 <= u && u <= 0xff9f){