Last active
September 14, 2016 10:43
-
-
Save neetsdkasu/5837349987c4ba9fcba7e44108411baf to your computer and use it in GitHub Desktop.
[JavaScript] 関数の引数をパース(?)する?(すごくショボくて使えないじょ) (この引数パースを使ってみたやつ→ https://git.io/vi20U )
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// parse arguments | |
// author : Leonardone @ NEETSDKASU | |
// license: MIT | |
// 他の関数の引数を仕分ける | |
//////////////////////////////////////////////////////////////////////////////// | |
// parseArguments(args, xpnd) | |
// args ... 仕分け対象の関数の引数 (自動変数 arguments を渡す) | |
// xpnd ... 仕分け方の配列 | |
//////////////////////////////////////////////////////////////////////////////// | |
// 仕分け方(xpnd)の仕様 | |
// xpnd | |
// [ArgSpec, ArgSpec, ... , ArgSpec] | |
// ArgSpec | |
// { | |
// vartype:, | |
// inscheck:, | |
// insclass:, | |
// optional:, | |
// dependend:, | |
// errmsg:, | |
// proc:, | |
// } | |
// vartype: | |
// string型、引数の型を指定する(e.g. "string", "number") | |
// 必須 | |
// inscheck: | |
// boolean型、instanceofでの型チェックを行うか | |
// 省略可能、省略時はfalse | |
// insclass: | |
// function型、inscheck:がtrueの場合に検査するクラス(e.g. Array) | |
// inscheckがtrueの場合は必須、それ以外の場合はこの指定は無視される | |
// optional: | |
// boolean型、この引数が省略可能かを示す | |
// 省略可能、省略時はfalse | |
// dependend: | |
// object型(配列、Arrayのインスタンス)、他の引数との関係を示す | |
// この引数が現れる『直前』に現れる必要のある引数仕様(ArgSpec)の | |
// xpndの配列内でのインデックスを並べた配列を指定する | |
// xpndは順番に処理されるためインデックスはこの引数より前のインデックスを指定する | |
// 関係対象の全ての引数が省略可能でありかつ全て省略された場合この引数も省略されるとみなされる | |
// 省略可能、省略時は他の引数とは無関係の引数とみなされる | |
// errmsg: | |
// string型、この引数が省略不可能な場合に例外スローするメッセージ | |
// 次のいずれにも該当しないときこの引数が省略不可能な場合である | |
// ・optionalにtrueが指定されている | |
// ・dependentで指定されたインデックスが直前に現れてない | |
// 省略可能、省略時はundefinedがスローされることになる | |
// proc: | |
// function型、この引数が存在した場合に呼び出す関数(この引数をこの関数第一引数に渡す) | |
// 必須 | |
//////////////////////////////////////////////////////////////////////////////// | |
parseArguments = (function() { | |
function checkSkip(x, p) { | |
var i, len; | |
if (x.dependent) { | |
len = x.dependent.length; | |
for (i = 0; i < len; i++) { | |
if (x.dependent[i] === p) { break; } | |
} | |
return i === len && len > 0; | |
} | |
return false; | |
} | |
function parseArguments(args, xpnd) { | |
var apos = 0; | |
var xpos = 0; | |
var lastxpos = -1; | |
var dep; | |
while (xpos < xpnd.length && apos < args.length) { | |
if (checkSkip(xpnd[xpos], lastxpos)) { | |
xpos++; | |
continue; | |
} | |
if (xpnd[xpos].vartype === typeof args[apos]) { | |
if (xpnd[xpos].inscheck !== true || args[apos] instanceof xpnd[xpos].insclass) { | |
xpnd[xpos].proc(args[apos]); | |
lastxpos = xpos; | |
xpos++; | |
apos++; | |
continue; | |
} | |
} | |
if (xpnd[xpos].optional) { | |
xpos++; | |
} else { | |
throw xpnd[xpos].errmsg; | |
} | |
} | |
while (xpos < xpnd.length) { | |
if (xpnd[xpos].optional || checkSkip(xpnd[xpos], lastxpos)) { | |
xpos++; | |
continue; | |
} | |
throw xpnd[xpos].errmsg; | |
} | |
return apos; | |
} | |
return parseArguments; | |
})(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!DOCTYPE html> | |
<html> | |
<head> | |
<meta charset="utf8" /> | |
<title>test parse arguments</title> | |
<script type="text/javascript" src="./parsearguments.js"></script> | |
</head> | |
<body> | |
<h1>test parse arguments</h1> | |
<script type="text/javascript"> | |
var piyo = {"log": function(s) { | |
document.write("<" + "div" + ">" + s + "<" + "/" + "div" + ">"); | |
}}; | |
function hoge() { | |
piyo.log('-------------------------------------'); | |
piyo.log('call hoge' + (function (a) { | |
var i, r = '('; | |
for (i = 0; i < a.length; i++) { | |
if (i > 0) r += ', '; | |
if ('string' === typeof a[i]) r += '"'; | |
if (a[i] instanceof Array) r += 'Array['; | |
r += a[i]; | |
if ('string' === typeof a[i]) r += '"'; | |
if (a[i] instanceof Array) r += ']'; | |
} | |
return r + ')'; | |
})(arguments)); | |
var xpnd = [ | |
{ "vartype" : "string" | |
, "inscheck" : false | |
, "optional" : true | |
, "dependent": [] | |
, "proc" : function (s) { piyo.log('first: ' + s); } | |
, "errmsg" : "" | |
}, | |
{ "vartype" : "string" | |
, "inscheck" : false | |
, "optional" : true | |
, "dependent": [0] | |
, "proc" : function (s) { piyo.log('second: ' + s); } | |
, "errmsg" : "" | |
}, | |
{ "vartype" : "boolean" | |
, "inscheck" : false | |
, "optional" : true | |
, "dependent": [0, 1] | |
, "proc" : function (s) { piyo.log('third: ' + s); } | |
, "errmsg" : "" | |
}, | |
{ "vartype" : "number" | |
, "inscheck" : false | |
, "optional" : false | |
, "dependent": [] | |
, "proc" : function (s) { piyo.log('forth: ' + s); } | |
, "errmsg" : "require numeric value (forth)" | |
}, | |
{ "vartype" : "number" | |
, "inscheck" : false | |
, "optional" : true | |
, "dependent": [] | |
, "proc" : function (s) { piyo.log('fifth: ' + s); } | |
, "errmsg" : "" | |
}, | |
{ "vartype" : "object" | |
, "inscheck" : true | |
, "insclass" : Array | |
, "optional" : true | |
, "dependent": [] | |
, "proc" : function (s) { piyo.log('sixth: ' + s); } | |
, "errmsg" : "" | |
}, | |
{ "vartype" : "boolean" | |
, "optional" : false | |
, "dependent": [5] | |
, "proc" : function (s) { piyo.log('seventh: ' + s); } | |
, "errmsg" : "need with sixth Array (seventh)" | |
}, | |
{ "vartype" : "object" | |
, "inscheck" : false | |
, "optional" : true | |
, "proc" : function (s) { piyo.log('eighth: ' + s); } | |
, "errmsg" : "" | |
} | |
]; | |
parseArguments(arguments, xpnd); | |
} | |
// test | |
hoge(5); | |
hoge('piyo', 10); | |
hoge('foo', 'bar', 15); | |
hoge('ask', 'boss', false, 20); | |
hoge('fuga', true, 33); | |
hoge(99, 100); | |
hoge('Like', 87, 45); | |
hoge('MAKE', 87, false); | |
hoge('xyz', 'ABC', true, 123, 987); | |
try { hoge(false, 45); } catch (e) { piyo.log('Exception: ' + e); } | |
try { hoge('a', 'b', 'c', 32); } catch (e) { piyo.log('Exception: ' + e); } | |
try { hoge('you', true, 'me', 45); } catch (e) { piyo.log('Exception: ' + e); } | |
hoge('arere?', 777, [2, 3, 5, 7], false); | |
hoge('why jap?', 119, 110, [11, 13, 17, 19], true); | |
hoge('damepo', 4649, {"length": 0}); | |
try { hoge('buru', 500, [10, 20, 30]); } catch (e) { piyo.log('Exception: ' + e); } | |
/* result output | |
------------------------------------- | |
call hoge(5) | |
forth: 5 | |
------------------------------------- | |
call hoge("piyo", 10) | |
first: piyo | |
forth: 10 | |
------------------------------------- | |
call hoge("foo", "bar", 15) | |
first: foo | |
second: bar | |
forth: 15 | |
------------------------------------- | |
call hoge("ask", "boss", false, 20) | |
first: ask | |
second: boss | |
third: false | |
forth: 20 | |
------------------------------------- | |
call hoge("fuga", true, 33) | |
first: fuga | |
third: true | |
forth: 33 | |
------------------------------------- | |
call hoge(99, 100) | |
forth: 99 | |
fifth: 100 | |
------------------------------------- | |
call hoge("Like", 87, 45) | |
first: Like | |
forth: 87 | |
fifth: 45 | |
------------------------------------- | |
call hoge("MAKE", 87, false) | |
first: MAKE | |
forth: 87 | |
------------------------------------- | |
call hoge("xyz", "ABC", true, 123, 987) | |
first: xyz | |
second: ABC | |
third: true | |
forth: 123 | |
fifth: 987 | |
------------------------------------- | |
call hoge(false, 45) | |
Exception: require numeric value (forth) | |
------------------------------------- | |
call hoge("a", "b", "c", 32) | |
first: a | |
second: b | |
Exception: require numeric value (forth) | |
------------------------------------- | |
call hoge("you", true, "me", 45) | |
first: you | |
third: true | |
Exception: require numeric value (forth) | |
------------------------------------- | |
call hoge("arere?", 777, Array[2,3,5,7], false) | |
first: arere? | |
forth: 777 | |
sixth: 2,3,5,7 | |
seventh: false | |
------------------------------------- | |
call hoge("why jap?", 119, 110, Array[11,13,17,19], true) | |
first: why jap? | |
forth: 119 | |
fifth: 110 | |
sixth: 11,13,17,19 | |
seventh: true | |
------------------------------------- | |
call hoge("damepo", 4649, [object Object]) | |
first: damepo | |
forth: 4649 | |
eighth: [object Object] | |
------------------------------------- | |
call hoge("buru", 500, Array[10,20,30]) | |
first: buru | |
forth: 500 | |
sixth: 10,20,30 | |
Exception: need with sixth Array (seventh) | |
*/ | |
</script> | |
</body> | |
</html> |
そういやfindIndexみたいなのあった気がするにゃあ
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
中々にバグが潜んでる