几道小题,挺有意思的,一起看看吧。
1、有一个数组是这样的,
var arr = [{“id”:“a”,‘ni’:“今天”}, {“id”:“68433”,‘ni’:“我擦”}, {“id”:“1231”,‘ni’:“擦擦”},{“id”:“a”,‘ni’:“天气”}, {“id”:“a”,‘ni’:“天气1”},{“id”:“WW”,‘ni’:“下雨”}, {“id”:“a”,‘ni’:“天气”}, {“id”:“a”,‘ni’:“天气”}, {“id”:“a”,‘ni’:“天气”}];
里面id相同的都去除,简单的去重,不过这个去重有点不一样的是,如果出现一样的,比如里面有id为a的几个,就全部去掉。
看看下面的实现:
var arr=[{"id":"a",'ni':"今天"}, {"id":"68433",'ni':"我擦"}, {"id":"1231",'ni':"擦擦"},{"id":"a",'ni':"天气"}, {"id":"a",'ni':"天气1"},{"id":"WW",'ni':"下雨"}, {"id":"a",'ni':"天气"}, {"id":"a",'ni':"天气"}, {"id":"a",'ni':"天气"}];
function removeTheSame (arr) {
var a = arr, result = [];
a.forEach(el => {
for(var i = 0; i < result.length; i ++) {
if( el.id === result[i].id ) {
result[i].flag = true;
el.flag = true;
}
}
result.push(el);
});
for(var i = 0; i < result.length; i ++) {
if(result[i].flag === true) {
result.splice(i, 1);
i --;
}
}
return result;
}
removeTheSame(arr);
其实呢,这个的核心思想,很简单,当id相等时去掉这个项对吧,不过呢,有个坑,是什么呢?就是当你直接去删掉这个项的时候,后面当有一样的id进来,你已经不知道了。会导致什么情况呢?就是当你相同id的项数为奇数时,则会多了一项。我这里呢用了标记法。如果你有什么更好的思路,请多多指教。
2、采用js写一个函数实现一个回文字符串判断。
先说明下,什么是回文字符串呢?跟回文对联是一样的,就是正着念跟倒着念是一样的,比如说“雪映梅花梅映雪”,“莺宜柳絮柳宜莺”。那怎么做呢?其实非常简单。
firstQuestion (string) {
if(typeof string !== 'string') return false;
return string.split("").reverse().join("") === string ? true : false;
},
就这样,OK。
3、求某年某月某日距某年某月某日相距多少天,如果只传入一个时间,则与当前时间比对。
如:dateDistance(“2018-01-01”,“2018-04-31”)会输出时间间隔。dateDistance(“2018-01-01”),这样也会,只不过是跟当前所处的时间做间隔。
首先我们要实现兼容的参数比较,当传入参数为两个的时候不做处理,当只传入一个的时候呢,把当前的时间格式化成一个时间字符串,传进来,这样,我们的处理逻辑就可以不用管了对吧?
看看哈:
// 兼容处理不传参
const adapt = day => {
let date = new Date(),
dayArr = day.split("-"),
dateArr = [date.getFullYear(), _Common.numFormat(date.getMonth() + 1), date.getDate()];
parseInt( dateArr.join("") ) > parseInt( dayArr.join("") ) ? endDay = dateArr.join("-") : ( endDay = firstDay, firstDay = dateArr.join("-") );
}
那要怎么做呢?注意到我们有个arguments。
if(arguments.length < 2) {
adapt(firstDay);
}
只需要当参数个数小于2的时候,调用处理逻辑就好了。
那怎么处理间隔呢?
我们想一下,年是有闰年的,对吧?这部分得处理,月份呢?我们简化一下我们的思路,就不要月啊日啊都去相减,那你会掉坑里的。我们只要做一个处理,就是返回一个某月某日在这一年是第几天,这样的话呢?我们先对比两个时间的1月1日的间隔,然后呢,后面的那个时间,是得加在这段时间间隔的对吧?前面的呢?得减掉对吧?嗯,没有错,这样就很简单的实现我们的想法了对吧?
先得有个处理返回第几天的函数对吧?
// 传入年月日 输出这一天是这一年的第几天
dayOfYear (year, month, date) {
let monthArr = [31, 29 + this.isLeapYear(year), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
result = 0;
if( date > monthArr[month - 1] ) {
alert("输入的第几日有误,请确保输入的日小于这个月的总天数");
return;
}
for(let i = 0; i < month - 1; i ++) {
result += monthArr[i];
}
return result + parseInt(date);
},
最后一起看下怎么处理这段时间间隔的吧。
const apartHandle = (firstDay, endDay) => {
let eDate = endDay.split("-"),
fDate = firstDay.split("-");
let days = 0;
for(let i = 0; i < parseInt(eDate[0]) - parseInt(fDate[0]); i ++) {
days += ( _self.isLeapYear (i + parseInt(fDate[0])) + 365 );
}
days += (_self.dayOfYear(eDate[0], eDate[1], eDate[2]) - _self.dayOfYear(fDate[0], fDate[1], fDate[2]));
return days;
}
看到这个里面有个isLeapYear的函数对吧?这个呢是用于判定是否是闰年的,这样:
// 判断哪一年是否闰年
isLeapYear (year) {
return year % 4 === 0 && year % 100 !== 0 ? 1 : (year % 400 === 0 ? 1 : 0);
},
这样我们的结果就完成啦。
4、平时获取url参数是怎样的?能自己写一个不?假如说传入一个字符串,那就返回以这个字符串名为参数名的参数值,没有传参则返回整个参数json。
其实啊,window.location.href记录的就是我们当前这个窗口的url,关键在于怎么处理这段url,当然网上或是有一段时间工作经验的前端都是有这样的资源的,不过呢,自己手动实现一下,是不是也还不错?
一起看看吧:
// 传参数名返回参数值,不传则返回所有参数名参数值的对象
getUrlParamsJSON (str) {
let url = window.location.href,obj={};
url.indexOf("?") > -1 ? url.split("?")[1].split("&").forEach(item => obj[item.split("=")[0]] = decodeURIComponent(item.split("=")[1]) || null) : obj = null;
return str ? (obj ? obj[str] : null ) : obj;
},
当然用正则匹配也是可以的。
5、这个我觉得挺有意思的,是什么呢?
如何定义一个变量a,使 a==1 && a == 3 && a == 5 && a == 7 && a == 9这样的式子返回true?
const a = {value : -1};
a.valueOf = function () {
return this.value += 2;
}
console.log(a == 1 && a == 3 && a == 5 && a == 7 && a == 9);
其实啊,这个主要还是利用js引擎内部的一些机制,宽松相等在做比较时呢,会把较高等级的变量类型转化成原始的number,string,boolean等等,而内部实际上是调用了valueOf方法,通过改写一些方法,达到当a执行时,会完成它的值转化。如果要深追的话呢,可以去看原文
共同学习,写下你的评论
评论加载中...
作者其他优质文章