幾道小題,挺有意思的,一起看看吧。

wh7577發表於2021-09-09

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執行時,會完成它的值轉化。如果要深追的話呢,可以去看

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2480/viewspace-2818172/,如需轉載,請註明出處,否則將追究法律責任。

相關文章