文章目录
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)