zoukankan      html  css  js  c++  java
  • 阿里笔试题

     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) 



  • 相关阅读:
    树链剖分 (模板) 洛谷3384
    ST表 (模板) 洛谷3865
    IOI 2005 River (洛谷 3354)
    IOI 2005 River (洛谷 3354)
    poj1094 Sorting It All Out
    poj1094 Sorting It All Out
    spfa(模板)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    洛谷1850(NOIp2016) 换教室——期望dp
  • 原文地址:https://www.cnblogs.com/huenchao/p/5936640.html
Copyright © 2011-2022 走看看