JavaScript 练习题

T1-9题目来源

https://github.com/iszu/web-learning/blob/master/JavaScript%E7%BB%83%E4%B9%A0%E9%A2%98.md

1. 计算两个日期的天数差

function daySpan(date1, date2){
	return parseInt((Math.abs(date1.getTime() - date2.getTime())) / 3600 / 24 / 1000);
}
daySpan(new Date(2016, 2, 7), new Date(2016, 4, 12));		//66
daySpan(new Date(2016, 4, 12), new Date(2016, 2, 7));		//66

2. 计算两个日期的天数差 - 高级版

function daySpan(date1, date2){
	return parseInt((Math.abs(Date.parse(date1) - Date.parse(date2))) / 3600 / 24 / 1000);
}
daySpan('2016-02-07', '2016-04-12');		//65
daySpan('2016-04-12', '2016-02-07');		//65

3. 计算数组中元素重复次数

function countRepeat (arr) {
  return _.countBy(arr, function(value){
  	return value.toString();
  })
}
function countRepeat(arr) {
    let obj = {}
    arr.map(x => obj[x] = obj[x] + 1 || 1)
    return obj
}
countRepeat([2, 9, 8, 4, 5, 3, 4, 8, 9, 9, 1, 0, 2, 1]);
//{0: 1, 1: 2, 2: 2, 3: 1, 4: 2, 5: 1, 8: 2, 9: 3}

4. 驼峰转换函数

function camelCase (str) {
  return str.split(/[\s\-]+/).map((s,i)=>{
  	return i===0? s.toLowerCase() : s.substring(0,1).toUpperCase()+s.substring(1).toLowerCase();
  }).join('');
}

camelCase('hey guys')           // 'heyGuys'
camelCase('HELLO-world')        // 'helloWorld'
camelCase('oh  mY---gOd')       // 'ohMyGod'

5. 寻找字符串中第一个未重复的字符

我第一次想到的方法,看起来很繁琐但是十分易懂:

function firstNonRepeat (str) {
	var i=0;
	for(var s of str) {
      if(str.lastIndexOf(s) === str.indexOf(s)){
      	i=1;
      	break;
      }
	}
	return i === 1 ? s : '';
}

所以我又想了一个看起来精简的方法但是实际上很繁琐:

function firstNonRepeat (str) {
  return str.split('').map(s=>str.lastIndexOf(s)===str.indexOf(s)?s:'').join('').substr(0,1);
}

firstNonRepeat('aaabccc')     // 'b'
firstNonRepeat('aabccbd')     // 'd'
firstNonRepeat('aabxbcc')     // 'x'
firstNonRepeat('6666666')     // ''

然后我百度了一下借鉴并修改了一下得出我觉得还行的方法,但是find()在没有找到时会返回undefine而不是题目中要求的''

function firstNonRepeat (str) {
  return str.split('').find((value)=>(str.lastIndexOf(value) === str.indexOf(value)));
}

6. 展平数组

function flatten (arr) {
	return _.flatten(arr);
}

可以用ES6新增的方法flat()

function flatten (arr) {
	return arr.flat(Infinity);
}

如果不用ES6的呢?自己想了一个方法:

function flatten(arr) {
    let result = [];
    // 遍历arr,展开arr第一层数组存入result
    arr.map(x => Array.isArray(x) ? x.map(y => result.push(y)) : result.push(x))
    // result中还有数组则递归
    return result.some(z => Array.isArray(z)) ? flatten(result) : result
}
flatten([1, 2, 3])                // [1, 2, 3]
flatten([1, 2, [3]])              // [1, 2, 3]
flatten([1, 2, [[3], 4]])         // [1, 2, 3, 4]
flatten([1, [2, [[3], [4]]]])     // [1, 2, 3, 4]

7. 判断空对象

function isEmptyObject (obj) {
	return typeof obj ==='object' && obj!==null && !Array.isArray(obj) ? true : false;
}
isEmptyObject({})              // true
isEmptyObject(null)            // false
isEmptyObject(undefined)       // false
isEmptyObject('{}')            // false
isEmptyObject([])              // false
isEmptyObject(true)            // false

8. 数组去重

function unique (arr) {
  return arr.filter((element,index)=>{
  	return arr.indexOf(element) === index;
  })
}
function unique (arr) {
  return [...new Set(arr)]
}
unique([1, 2, 3, 4, 4, 5, 8, 6, 3, 2, 1])   // [1, 2, 3, 4, 5, 8, 6]

此处扩展一下字符串去重:

function uniqueStr(str){
	return [...new Set(str)].join('')
}
uniqueStr('abaaabddyhehrrywerh')   // 'abdyherw'

9. 实现一个 reduce 函数

function reduce(arr, func, initialValue){
	var previousValue = initialValue||arr[0];
	var currentValue;
	var i = initialValue?0:1;
	for(;arr[i];i++){
		currentValue = arr[i];
		previousValue = func(previousValue,currentValue);
	}
	return previousValue;
}

题目3、题目6、题目8可用reduce实现:https://blog.csdn.net/u013448372/article/details/105759325

10、快速创建0到n-1范围数组

Array.from(Array(n), (value, index) => index)

Array.from({length: n}, (value, index) => index)

[...Array(n).keys()]

new Array(n).fill(1).map((value,index) => index)
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值