任務 請在index.html檔案中,編寫arraysSimilar函數,實現判斷傳入的兩個陣列是否相似。具體需求: 數組中的成員類型相同,順序可以不同。例如[1, true] 與 [false, 2]是相似的。 數組的長度一致。 類型的判斷範圍,需要區分:String, Boolean, Number, undefined, null, 函數,日期, window. 當以上全部滿足,則返回"判定結果:通過",否則返回"判定結果:不通過"。
這是一個奇怪的需求,主要是要求「相似」的判斷。
第一直覺是直接對陣列排序,然後比較類型。但由於JS比較大小的特性,這是不對的。
那麼需要變換一下,我這裡是取每個元素的型別名稱簡寫,這樣可以近似\(O(NlogN)\)排字典序,再將其當作整個陣列的typo,就可以近似\(O(N)\)比較數組是否相似。
第二個要注意的點是對無效參數的判斷,一開始是用== null
來判斷null
和undefined
的,但是要求參數類型為數組,所以用instanceof
判斷。
取得類型的替代方案是用Object.prototype.toString()
,可以準確地拿到原型鏈上物件的類別名,但是函數可能會被重寫,所以不優先使用。
/* * param1 Array * param2 Array * return true or false */function arraysSimilar(arr1, arr2) { // 获取单个元素的类型名简写,已经满足需求 // 替代方案:考虑用Object.prototype.toString,但会被hack function getTypeNameS(item) { if (item === null)return 'nl'; else if (item instanceof Date) return 'd'; else if (item instanceof Window) return 'w'; elsereturn (typeof item)[0]; } // 获取整个数组排序后的typo function getArrayTypo(arr) { return arr.map(function (item) { return getTypeNameS(item); }).sort().join(''); } // 可以判断==null,但由于要求类型为数组,那就用instanceof if (!(arr1 instanceof Array) || !(arr2 instanceof Array)) return false; // 长度不等的情况,可以合并到typo比较中 if (arr1.length != arr2.length)return false; // 对于typo使用内置的字符串比较 return getArrayTypo(arr1) == getArrayTypo(arr2); }
本文基於知識共享許可協議知識共享署名-非商業性使用-相同方式共享4.0 國際許可協議發布,歡迎引用、轉載或演繹,但是必須保留本文的署名BlackStorm以及本文鏈接,且未經許可不能用於商業目的。如有疑問或授權協商請與我聯絡。
以上是imooc《JavaScript深入淺出》上的一個arraysSimilar函數的詳細內容。更多資訊請關注PHP中文網其他相關文章!