幾道小題,挺有意思的,一起看看吧。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 幾道前端面試題小記前端面試題
- 從幾道面試題看物件的初始化面試題物件
- 前端程式設計師的趣事,一起來看看吧前端程式設計師
- 面試中常見的幾道智力題 來看看你會做幾道(2)?面試
- 分享一個簡單但挺有意思的演算法題-雜湊-二分-雙指標演算法指標
- 談談OKHttp的幾道面試題HTTP面試題
- 一道有意思的面試演算法題面試演算法
- 一道有意思的微信前端面試題前端面試題
- 一道有意思的 CSS 面試題,FizzBuzz ~CSS面試題
- 技術面試中常見的幾道智力題 來看看你會做幾道?面試
- 區塊鏈認知過程,幾個有意思的小故事區塊鏈
- 分享一個簡單但挺有意思的演算法題2-貪心-單調棧-動態規劃演算法動態規劃
- 分享幾道我們面試前端的“真題”面試前端
- 【Java】幾道常見的秋招面試題Java面試題
- 【Java】幾道讓你拿offer的面試題Java面試題
- 小白歡樂多——記ssctf的幾道題目
- 內外網收發檔案的方法有哪些?一起來看看吧
- 挺有意思:PHP 將N秒內連續的記錄視為一條記錄PHP
- 雲端計算有什麼優勢?一起來看看吧!
- 電腦硬體哪些容易出現故障?一起來看看吧!
- 幾道高階前端面試題解析前端面試題
- Redis學習的幾個小問題Redis
- 劍指offer中幾道演算法題的思考演算法
- 面試現場簡單幾道java演算法題, 你能寫出幾道?面試Java演算法
- 10 道資料結構演算法題,不看答案你會幾道題資料結構演算法
- 一道被前端忽略的基礎題,不信看你會幾題前端
- 22道js輸出順序問題,你能做出幾道JS
- 十幾道含答案的大廠面試題總結面試題
- 幾道特別難搞的資料庫面試題資料庫面試題
- 一道小學數學題的解決
- 75 道 BAJT 高階 Java 面試題,你能答上幾道?Java面試題
- 75 道 BAJT 中高階 Java 面試題,你能答上幾道?Java面試題
- 27道Redis精選面試題,你會做幾題?Redis面試題
- 通過一道題來看React事件模型React事件模型
- 微信小程式開發中遇到的幾個小問題微信小程式
- 分享幾個有意思的陣列方法陣列
- 2019年幾道常見js面試題整理JS面試題
- 搞定ReentrantReadWriteLock 幾道小小數學題就夠了