惊呆了!js实现仿C#中List<T>.Find()、List<T>.Where() 方法,使用js查找so easy
唐僧:八戒,帮为师找下少林寺年龄大于20的和尚。
八戒:这个也太简单了。
private static IEnumerable<Monk> GetMonks(IEnumerable<Monk> monks, int age) { var newMonks = new List<Monk>(); foreach (Monk monk in monks) { if (monk.Age > age) { newMonks.Add(monk); } } return newMonks; }
唐僧:这样的代码你也好意思拿得出手?不要跟别人说你是我的徒弟。
八戒:......
八戒:师父,那怎么写?
唐僧:不会用linq么?
八戒:师父英明。
private static IEnumerable<Monk> GetMonks(IEnumerable<Monk> monks, int age) { return from monk in monks where monk.Age > age select monk; }
private static IEnumerable<Monk> GetMonks(IEnumerable<Monk> monks, int age) { return monks.Where(monk=>monk.Age>age); }
八戒:哈哈,一句话搞定。
唐僧:这才像是我教出来的徒弟。
八戒:(得瑟)
唐僧:别高兴太早,如果我要求你在前端实现呢?
八戒:这都不一样,遍历呗。
唐僧:如果很多地方都要查,并且条件都不同呢?
八戒:那就写多个遍历。
唐僧:你out了,今天为师教你一招,用js仿C#的List<T>.Find()、List<T>.Where() 方法。
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8" /> <title></title> <script type="text/javascript"> window.onload = function () { var monks = [{ Id: 1, Name: '唐僧', Age: 30, FaHao: '玄奘' }, { Id: 2, Name: '孙悟空', Age: 500, FaHao: '悟空' }, { Id: 3, Name: '猪八戒', Age: 25, FaHao: '悟能' }, { Id: 4, Name: '沙僧', Age: 300, FaHao: '悟净' }]; var monk1 = monks.Find({ Name: '孙悟空' }); alert(monk1.FaHao);//悟空 var monks2 = monks.Where(function (m) { return m.Age > 30; }); alert(monks2.length);//2 } /* 函数:根据条件从对象数组中获取一个对象 参数:匿名函数,字段,值 返回:查找到的对象,如果没有查找到返回null 调用方式:var result=list.Find(function (o) { return o.Age>30; }); var result=list.Find(function () { return this.Age>30; }); var result=list.Find("Age",22); var result=list.Find({Age:22}); */ Array.prototype.Find = function (property, value) { // var fn = typeof property === "function" ? property : function () { return this[property] == value; }; var tp = typeof property, fn; switch (tp) { case "function": fn = property; break; case "object": fn = function () { return equal(this, property); }; break; default: fn = function () { return this[property] == value; }; break; } for (var i = 0, len = this.length; i < len; i++) { var o = this[i]; if (fn.call(o, o)) { return o; } } return null; }; /* 函数:根据条件查询对象数组 参数:匿名函数;字段,值 返回:查找到的对象数组 调用方式:var result=list.Where(function (m) { return m.Age>30; }); var result=list.Where(function () { return this.Age>30; }); var result=list.Where("Age",22); var result=list.Where({Age:22}); */ Array.prototype.Where = function (property, value) { var arr = [], tp = typeof property, fn; switch (tp) { case "function": fn = property; break; case "object": fn = function () { return equal(this, property); }; break; default: fn = function () { return this[property] == value; }; break; } for (var i = 0, len = this.length; i < len; i++) { var o = this[i]; if (fn.call(o, o)) { arr.push(o); } } return arr; }; /* 函数:简单对象相等比较,比较两个对象中的所有属性(不包含继承或通过prototype扩展的)是否全部相等 参数:目标要比较的对象 返回:相等返回true,否则返回false 调用方式:var result=equal(sourceObj,{Id:66,Age:66}); */ function equal(sourceObj, targetObj) { for (var key in targetObj) { if (sourceObj[key] != targetObj[key]) { return false; } } return true; } </script> </head> <body> </body> </html>
八戒:好牛X啊,师父V5。
唐僧:别贫了,多学着点吧!
八戒:弟子谨遵师父教诲,苦敲代码,他日必将修炼成代码大神。
八戒:师父,你这么牛X,你妈造吗?
唐僧:......
posted on 2014-12-29 10:44 xiaoafei1991 阅读(1743) 评论(0) 编辑 收藏 举报