解决问题2

作者: 花开有声是我 | 来源:发表于2018-07-24 14:43 被阅读0次
    21.将一个任意长的数字变成逗号分隔的格式
    方法一:
     format_number(n){
          let b=parseInt(n).toString();
          let len=b.length;
          if(len<=3){return b;}
          let r=len%3;
          return r>0?b.slice(0,r)+","+b.slice(r,len).match(/\d{3}/g).join(","):b.slice(r,len).match(/\d{3}/g).join(",");
      },
    
    方法二:
      format_number(str){
          return str=str.split('').reverse().join('').replace(/(\d{3})/g,'$1,').replace(/\,$/,'').split('').reverse().join('');
       },
    
    方法三:
      formatText(str){      
        var _str=item.remainAmount.toString();   
        var    _delimiter=',';
        var  regText='\\d{1,'+3+'}(?=(\\d{'+3+'})+$)';        
        var  reg=new  RegExp(regText,'g');   
        return  _str.replace(/^(-?)(\d+)((\.\d+)?)$/, 
        function($0, $1, $2, $3) {
              return   $1 + $2.replace(reg, '$&,') + $3; })
       }
    
    方法四:

    var s = '1234564656,000.00';
    var d=s.replace(/(\d)(?=(\d{3})+(?!\d))/g, "$1,")
    alert(d)


    22. 尽可能全面正确的解析一个任意url的所有参数为Object

    var url = 'http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&d&enabled';
    parseParam(url);
    结果:
    {
    user: 'anonymous',
    id: [123, 456], // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
    city: '北京', // 中文
    enabled: true, // 未指定值的 key 约定值为 true
    }

    23. 实现一个简单的模板引擎

    render('我是{{name}},年龄{{age}},性别{{sex}}',{
    name:'姓名',
    age:18
    })
    // 结果: 我是姓名,年龄18,性别undefined。


    var render = function(tpl,data){
    return tpl.replace(
    /{{(.+?)}}/g,
    function(m,m1){
    return data[m1]
    })
    }
    //注释:/{{(.+?)}}/g:在全部范围内查找匹配前后有两组花括号的字符串


    24. 有一个全局变量 a,有一个全局函数 b,实现一个方法bindData,执行后,a的任何赋值都会触发b的执行。

    var a = 1;
    function b(){
    console.log('a的值发生改变');
    }
    bindData();
    a = 2; // 此时输出 a的值发生改变


    function bindData(target, event){
    for(var key in target) {
    if(target.hasOwnProperty(key)) {
    (function(){
    var v = target[key];
    Object.defineProperty(target, key, {
    get: function() {
    return v;
    },
    set: function(_value) {
    v = _value;
    event.call(this)
    }
    })
    })()
    }
    }
    }


    25. 实现一个 js 的 class ,名字叫做:AnimateToNum,功能是从某个数字递增或者递减到另外一个数字,并且不管数字如何变化,都可以在指定的时间内完成。

    var AnimateToNum = require("animate-num");

    var numAnim = new AnimateToNum({
    animTime:2000, //每次数字变动持续的时间(ms),
    initNum:500, //初始化的数字
    onChange:function(num){
    console.log(num);
    }
    });

    numAnim.toNum(100); // 从500变化到100,用2000ms的时间,在onChange回调中会一直从500倒数到100

    26. 递归

    现提供几个读取文件的方法,不借助全局变量实现一个函数,函数可以执行一次后返回一个目录下所有文件中是 .js 后缀的文件列表
    var readdirSync = function(dir_path){ return [filename] } // 读取一个文件夹下的所有文件夹和文件的路径列表(Array)
    var isDirectory = function(path) { return true/false; } // 判断一个路径是否是文件夹
    var existsSync = function(path){ return true/false;} // 判断一个文件/文件夹是否存在

    var getJSFiles = function(path) {

    }
    getJSFiles('/code/'); // return 一个文件列表的数组

    var getJSFiles = function(path) {
    var result = [];
    if(existsSync(path)) {
    if(isDirectory(path)) {
    var files = readdirSync(path);
    files.forEach((file) => {
    result = result.concat(getJSFiles(file));
    });
    } else if(/.js$/.test(path)) {
    result.push(path);
    }
    }
    return result;
    }

    27. 请封装一个 CustomFetch 方法,利用原生的 fetch api,但是实现以下几个需求:

    所有请求默认带上一个 token,值是 xxx
    请求返回的时候,内部解析内容,并且判断 success 字段是否是 true,如果不是,在 catch 中可以拿到一个Error,message 和 code 是接口返回的对应的内容

    CustomFetch("http://api.com/api").then((data)=>{
    console.log(data); // 如果后台返回 true
    }).catch((e)=>{
    console.log(e.message); // 输出 “查询错误”
    });

    // 接口的返回模式
    {
    success: false,
    code: 'QUERY_ERROR',
    data: {},
    message: '查询错误'
    }

    28. 将数字转换成中文大写的表示,处理到万级别,例如 12345 -> 一万二千三百四十五

    function toLowerNum(){

    }
    console.log(toLowerNum(12345)); // 输出 一万二千三百四十五
    console.log(toLowerNum(10001)); // 输出 一万零一
    console.log(toLowerNum(10011)); // 输出 一万零十一
    console.log(toLowerNum(10000)); // 输出 一万

    function toLowerNum(num){
    var number = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九'] // 定义中文数字
    var unit = ['', '十', '百', '千', '万'] // 定义中文基
    var resultStr = []
    var len = 0 // 数字长
    var lastNumNotZero = false
    while(num){
    let n = num % 10
    let u = len >= unit.length ? len % 5 + 1 : len % 5

        // console.log(n, u, len)
        // 添加基
        // if(n || (len >= unit.length && lastNumNotZero))
        if(
            n // 当前位存在
            || // 或者
            ( u == unit.length - 1 && // u 和 长度均为 最后一位unit
                len == unit.length - 1
            )
        )
            resultStr.unshift(unit[u])
    
        // 处理数
        if(
            n || lastNumNotZero // 当前位和前一位不都为零则处理
            && 
            u !== unit.length - 1 // 且当前位不为最后一位基
        ) 
            resultStr.unshift(number[n])
        lastNumNotZero = !!n
        len++
        num = Math.floor(num / 10)
    }
    return resultStr.join('')
    

    }

    29. 算法题,实现一个函数,可以判断 a 字符串是否被包含在 b 字符串中

    不能用原生api,自己实现一个字符串查找
    我:
    var b='abcabcdef'
    var a='cde'
    var j = 0;
    var m=0;
    var result = false;
    for(var i=0;i<a.length;i++){
    while(j<b.length&&a[i] != b[j]){
    j++;
    }
    j++;
    if(a[i]!=b[j]) m++
    else m=0
    }
    if(m==a.length) result = true

    http://blog.csdn.net/buaa_shang/article/details/9907183

    var b='abcabcdef'
    var a='cde'
    var j = 0;
    var m=0;
    var result = false;
    for(var i=0;i<a.length;i++){
    while(j<b.length&&a[i] != b[j]){
    j++;
    }
    j++;
    if(a[i]!=b[j]) m++
    else m=0
    }
    if(m==a.length) result = true

    30. 下面五段代码分别输出什么?并且什么时候输出什么?

    for(var i = 0; i < 5; i++) {
    console.log(i);
    }
    for(var i = 0; i < 5; i++) {
    setTimeout(function() {
    console.log(i);
    }, 1000 * i);
    }
    for(var i = 0; i < 5; i++) {
    (function(i) {
    setTimeout(function() {
    console.log(i);
    }, i * 1000);
    })(i);
    }
    for(var i = 0; i < 5; i++) {
    (function() {
    setTimeout(function() {
    console.log(i);
    }, i * 1000);
    })(i);
    }
    for(var i = 0; i < 5; i++) {
    setTimeout((function(i) {
    console.log(i);
    })(i), i * 1000);
    }

    31. 判断一个点是否在多边形内

    答:从当前点画一条水平射线,判断射线与多边形各条边相交多少次,偶数次就是在多边形内

    相关文章

      网友评论

        本文标题:解决问题2

        本文链接:https://www.haomeiwen.com/subject/wuoemftx.html