• 阿里笔试题


     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) 



  • 相关阅读:
    原码、反码、补码之间的相互关系
    在用 JavaScript 工作时,我们经常和条件语句打交道,这里有5条让你写出更好/干净的条件语句的建议。
    冒泡排序最佳情况的时间复杂度
    path的join和resolve的使用区别
    SCSS入门
    webpack 前后端分离开发接口调试解决方案,proxyTable解决方案
    JS中原型链的理解
    30分钟,让你彻底明白Promise原理
    状态码常用对照表
    前端性能优化方案都有哪些?
  • 原文地址:https://www.cnblogs.com/huenchao/p/5936640.html
Copyright © 2020-2023  润新知