为了账号安全,请及时绑定邮箱和手机立即绑定

几道小题,挺有意思的,一起看看吧。

标签:
JavaScript

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执行时,会完成它的值转化。如果要深追的话呢,可以去看原文

点击查看更多内容
3人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消