1 var origin = [ 2 {id:1,title:'title1'}, 3 {id:2,title:'abcd'}, 4 {id:3,title:'title2'}, 5 {id:4,title:'efg'} 6 ]; 7 8 var find = function(data){ 9 // your code here 10 } 11 12 var result = find(origin).where({'title':/d$/}).order('id','desc'); //desc 非递增 13 console.log(result); // [{id:3,title:'title2'},{id:1,title:'title1'}]
写了10分钟左右:随便A了一下
var origin = [ {id: 1, title: 'title1'}, {id: 2, title: 'abcd'}, {id: 3, title: 'title2'}, {id: 4, title: 'efg'} ]; var find = function (data) { // your code here function jquery(data) { this.where = function (obj) { var arr = []; var self = this; var key = Object.keys(obj)[0]; var temp = self.data; for (var j = 0; j < temp.length; j++) { if (obj[key].test(temp[j][key])) { arr.push(temp[j]); } } this.data = arr; return this; }; this.order = function (name, desc) { var self =this; //降序 if (desc === "desc") { for (var i = 1; i < self.data.length; i++) { var j = i - 1; var key = self.data[i][name]; while (j >= 0 && self.data[j][name] < key) { self.data[j + 1][name] = self.data[j][name]; j--; } self.data[j + 1][name] = key; } } return self.data; }; this.data = data; } return new jquery(data); }; var result = find(origin).where({'title': /d$/}).order('id', 'desc'); //desc 非递增 console.log(result); // [{id:3,title:'title2'},{id:1,title:'title1'}]
唉,取属性的时候,hasOwnPrototype我忘记怎么写了,后来查了一下,原来他是用来确认的,我了个,后来机智的我想起来es5好像出了keys这个方法,然后试了试果然用这个,然后就这样咯。排序我用的插入排序,你可以选择冒泡,选择,快排,归并,计数,堆排序等等,不会的可以看我的算法博客。我看了下别人的代码,原来js有sort这个方法。大家自己去了解吧。其实链式调用就是返回this咯,没什么大不了的。反正写的不怎么样,将就看一下吧,完美的话,个人认为在Object.keys()上面做文章。比如我在where方法里传的参数可以有很多keys:
{'title':/d$/,
'id:'/[2-4]/,
...
}
那这个时候,就要在做好多次筛选了,怎么做大家自己动脑筋吧。还有就是这个排序。我们现在是只可以传入desc. 其实我们知道有降序就会有升序(asc),当然还有乱序。 阿里啊,这不是考我们mongodb吗。熟悉mongodb的同学这里是不是看起来很像。
1 // ali-for 2 var items = [ 3 {name:'item1'}, 4 {name:'item2'} 5 ]; 6 var str = '<div ali-for="item in items">{{item.name}}<div>'; 7 8 var ParseDom = function(str){ 9 // your code here 10 } 11 12 // 对应生成的dom 13 // <div>item1</div> 14 // <div>item2</div>
这题目,我是没做出来,我认为,起码是不能直接认为是div的,一定是匹配html标签。下面填一个别人写的,主要考察的是正则表达式
1 var items = [ 2 {name:'item1'}, 3 {name:'item2'} 4 ]; 5 var str = '<div ali-for="item in items">{{item.name}}<div>'; 6 7 var ParseDom = function(str){ 8 9 var reg1 = /sali-for="[a-zA-Zs]+"/gi, 10 reg2 = /{{2}[a-zA-Z.]+}{2}/gi, 11 reg3 = /.[a-zA-Z]+/gi, 12 len = items.length; 13 14 var temp = str.replace(reg1,''), 15 fill = str.match(reg2)[0], 16 key = str.match(reg2)[0].match(reg3)[0].slice(1), 17 clone_temp ='', 18 str = ''; 19 20 for(var i=0;i<len;i++){ 21 clone_temp = temp; 22 str+=clone_temp.replace(fill,items[i][key]); 23 } 24 25 console.log(str); 26 27 }
这个答案我是不满意的,最近也准备写一些正则方面的文章,等有时间了,自己好好的实现一下,不过有看到的博友,有好的想法,可以在评论里共享一下,好的话就用你的作为解法,给大家参考。
今天自己写了一个版本,进步也挺多的,附上我的代码:
1 var obj = { 2 rformat: /{{([^{}]+)}}/gm, //匹配所有{{ res.key }} 3 resobj: /..*/, //对.key进行处理 4 // repeat1: /(?!sali-for=)".*"/gi, 5 repeat1: /sali-for=(".*")/gi, 6 repeat2: /sali-for=".*"/gi, 7 htmlstr: '<div ali-for="item in items">{{item.name}}</div>', 8 getinfo: function () { 9 var str = this.repeat1.exec(this.htmlstr)[1]; 10 str = str.slice(1, str.length - 1); //去除两端双引号 11 return str.split(" "); 12 }, 13 items: { 14 one: { 15 name: "小明" 16 }, 17 two: { 18 name: "小王" 19 } 20 }, 21 replaceAll: function (str, regexp, sptr) { 22 23 while (regexp.test(str)) { 24 str = str.replace(regexp, sptr); 25 26 return str; 27 } 28 29 }, 30 31 change4dom: function () { 32 var arr = this.getinfo(); 33 var res = this[arr[2]] || {}; //资源对象 items 34 var res_child = arr[0]; //资源子对象 item 35 var htmldom = ""; 36 var keyname = /(?!.).*/i; 37 var ItemRegexp = /w*(?=.)/i; //检查时候是否item 38 39 for (var key in res) { 40 //将 {{ item.key }} 替换掉 41 htmldom += this.htmlstr.replace(this.rformat, function ($0, $1) { 42 // all:{{ item.key }} , $1:item.key 43 try { 44 45 var A = $1.split("."); 46 var isItem = A[0]; 47 var value = A[1]; 48 49 if (isItem === res_child) { 50 return res[key][value]; 51 52 } else { 53 throw new Error('不匹配'); 54 } 55 } catch (e) { 56 57 return $0; //错误原样返回 58 } 59 }); 60 htmldom = this.replaceAll(htmldom, this.repeat2, function ($0, $1) { 61 return ""; 62 }); 63 64 } 65 66 67 return htmldom; 68 } 69 }; 70 71 72 console.log(obj.change4dom());
主要是进步在于原来replace只替换第一个匹配的,我们可以迭代实现replaceAll,还有就是
虽然这些在上面用不到,还有就是js不支持(?<=pattern)