public static Constant map(Constant _this, Constant[] arguments, Scope scope) { var array = (Javascript.Array)_this; if (arguments.Length != 1) { throw new Javascript.TypeError("Array.map takes one argument"); } var callback = (Javascript.Function)arguments[0]; var result = new Javascript.Array(); for (int i = 0; i < array.List.Count; i++) { var callbackArguments = new ArgumentList() { Arguments = new List <Expression>() { array.List[i], new Javascript.Number(i), array } }; var value = callback.Call(callbackArguments, Static.Undefined, scope); result.List.Add(value); } return(result); }
public static Constant slice(Constant _this, Constant[] arguments, Scope scope) { var array = (Javascript.Array)_this; var begin = (int)(arguments.Length > 0 ? ((Javascript.Number)arguments[0]).Value : 0); var end = (int)(arguments.Length > 1 ? ((Javascript.Number)arguments[1]).Value : array.List.Count); var result = new Javascript.Array(); for (int i = begin; i < end; i++) { result.List.Add(array.List[i]); } return(result); }
public Javascript.Object InvokeMember(int index, string[] names, Javascript.Array arguments) { if (index + 1 == names.Length) { try{ return(((FunctionBase)this[names[index]]).Invoke(this, arguments)); }catch (System.NullReferenceException e) { //※: 一回目の NullReferenceException は時間がかかる throw new Null.UndefinedException(e); }catch (System.InvalidCastException e) { throw new System.Exception("指定したオブジェクトは関数ではありません", e); }catch (System.Exception e) { throw e; } } else { return(this[names[index]].InvokeMember(index + 1, names, arguments)); } }
public static Constant filter(Constant _this, Constant[] arguments, Scope scope) { var array = (Javascript.Array)_this; if (arguments.Length == 0 || arguments.Length > 2) { throw new Javascript.TypeError("Array.filter takes one or two argument"); } var callback = (Javascript.Function)arguments[0]; var result = new Javascript.Array(); for (int i = 0; i < array.List.Count; i++) { var element = array.List[i]; var callbackArguments = new ArgumentList() { Arguments = new List <Expression>() { element, new Javascript.Number(i), array } }; var value = callback.Call(callbackArguments, arguments.Length == 1 ? Static.Undefined : arguments[1], scope); if (value is Javascript.Boolean) { if (((Javascript.Boolean)value).Value) { result.List.Add(element); } } } return(result); }
public static Constant splice(Constant _this, Constant[] arguments, Scope scope) { var array = (Javascript.Array)_this; var start = arguments.Length > 0 ? (int)Tool.GetArgument <Javascript.Number>(arguments, 0, "Array.splice").Value : 0; var count = (int)(arguments.Length > 1 ? ((Javascript.Number)arguments[1]).Value : array.List.Count - start); // Remove items var result = new Javascript.Array(); result.List.AddRange(array.List.GetRange(start, count)); array.List.RemoveRange(start, count); // Add items var addCount = arguments.Length <= 2 ? 0 : arguments.Length - 2; for (var i = 0; i < addCount; i++) { array.List.Insert(start + i, arguments[i + 2]); } return(result); }