javascript算法(一)

1、实现一个函数,运算结果可以满足如下预期结果:

add(1)(2) // 3
add(1, 2, 3)(10) // 16
add(1)(2)(3)(4)(5) // 15
实现:

function add () {
    var args = Array.prototype.slice.call(arguments);
 
    var fn = function () {
        var arg_fn = Array.prototype.slice.call(arguments);
        return add.apply(null, args.concat(arg_fn));
    }
 
    fn.valueOf = function () {
        return args.reduce(function(a, b) {
            return a + b;
        })
    }
 
    return fn;
}

2、利用给定接口获得闭包内部对象。

var o = (function() {
    var person = {
        name: 'Vincent',
        age: 24,
    };
    return {
        run: function(k) {
            return person[k];
        },
    }
}());
实现:

Object.defineProperty(Object.prototype, 'self', 
    {
        get: function() {
            return this;
        },
        configurable: true
    });
o.run('self'); // 输出 person


3、实现浮点数转整数,或者说取出数字的整数部分。比如 -12.921 --> -1212.921 --> 12等等。

实现:

function convertToInt(num) {
      return num >> 0;
}
convertToInt(-Math.PI); // -3
convertToInt(12.921); // 12
利用了有符号右移会将左操作数转换为32位整数。同理, num | 0也是可以的。


4、数组的展开/扁平

[1,2,[2,3,[4,5]]]--->[1,2,2,3,4,5]

实现:

function flatten(arr) {
    if(!isArray(arr) || !arr.length) {
        return [];
    } else {
        return Array.prototype.concat.apply([], arr.map(function(val) {
            return isArray(val) ? flatten(val) : val;
        }));
    }

    function isArray(arr) {
        return Object.prototype.toString.call(arr).slice(8, -1).toLowerCase() === 'array';
    }
}
flatten([1,2,[2,3,[4,5]]]);
// [1, 2, 2, 3, 4, 5]

5、找出字符串中出现最多的字母

'ababccdeajxac'

实现:

function getMaxNumberOfChar(str) {
    return (str + '').split('').reduce(function(pre, cur, index, arr) {
        cur in pre ? pre[cur]++ : (pre[cur] = 1);
        pre[cur] > pre.value && (pre.char = cur, pre.value = pre[cur]);
        return pre;
    }, {value: 0});
}
getMaxNumberOfChar('ababccdeajxac') // Object {value: 4, a: 4, char: "a", b: 2, c: 3…}

或者利用正则处理

function getMaxNumberOfChar(str) {
    return (str + '').split('').sort().join('').match(/(\w)\1*/g).reduce(function(pre, cur) {
        return cur.length > pre.value ? {value: cur.length, char: cur[0]} : pre;
    }, {value: 0})
}
getMaxNumberOfChar('ababccdeajxac') // Object {value: 4, char: "a"}

6、编写一个方法 求一个字符串的字节长度

实现:

/*假设:一个英文字符占用一个字节,一个中文字符占用两个字节*/
function getBytes(str){
  var len = str.length,
      bytes = len,
      i = 0;
  for(; i<len; i++){
      if (str.charCodeAt(i) > 255) bytes++;
  }
  return bytes;
}
alert(getBytes("玩,as"));


7、深克隆一个对象

Object.clone=function(obj){//深克隆
if(typeof(obj)=="object"){//如果obj是对象
  var o=//有必要区分数组和普通对象
  Object.prototype.toString.call(obj)=="[object Array]"?[]:{};
      for(var key in obj){//遍历obj的自有属性
          //如果key是obj的自有属性
          if(obj.hasOwnProperty(key)){
              o[key]=arguments.callee(obj[key]);//arguments.callee调的是当前的Object.clone函数
              }
      }
      return o;
      }else{//如果obj是原始类型的值,就直接返回副本
          return obj;
      }
  }


8、用 JS 编写函数从下面的 URL 串中解析出所有的参数:

http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&d&enabled
返回结构如下:

{
  user: 'anonymous',
  id: [123, 456],     // 重复出现的 key 要组装成数组,能被转成数字的就转成数字类型
  city: '北京',        // 中文
  enabled: true,      // 未指定值的 key 约定值为 true
}
实现:

function parse(str) {
  if (typeof str !== 'string') {
    return {};
  }

  var paramObj = {};
  var paramArr = decodeURI(str).split('&');
  for (var i = 0; i < paramArr.length; i++) {
    var tmp = paramArr[i].split('=');
    var key = tmp[0];
    var value = tmp[1] || true;

    // 处理数字:很多人忽略这里的类型判断,布尔值传给 Number 也会解析出数字
    if (typeof value === 'string' && isNaN(Number(value)) === false) {
      value = Number(value);
    }

    if (typeof paramObj[key] === 'undefined') {
      paramObj[key] = value;
    } else {
      var newValue = Array.isArray(paramObj[key]) ? paramObj[key] : [paramObj[key]];
      newValue.push(value);
      paramObj[key] = newValue;
    }
  }

  return paramObj;
}
ES6方式:

function parse(str) {
  if (typeof str !== 'string') {
    return {};
  }

  return decodeURI(str).split('&').map(param => {
    const tmp = param.split('=');
    const key = tmp[0];
    let value = tmp[1] || true;
    if (typeof value === 'string' && isNaN(Number(value)) === false) {
      value = Number(value);
    }

    return { key, value };
  }).reduce((params, item) => {
    const { key, value } = item;
    if (typeof params[key] === 'undefined') {
      params[key] = value;
    } else {
      params[key] = Array.isArray(params[key]) ? params[key] : [params[key]];
      params[key].push(value);
    }

    return params;
  }, {});
}
也可以用部分浏览器最新的特性 URLSearchParams












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值