首頁  >  文章  >  web前端  >  imooc《JavaScript深入淺出》上的一個arraysSimilar函數

imooc《JavaScript深入淺出》上的一個arraysSimilar函數

PHP中文网
PHP中文网原創
2018-05-19 16:38:321099瀏覽

任務 請在index.html檔案中,編寫arraysSimilar函數,實現判斷傳入的兩個陣列是否相似。具體需求: 數組中的成員類型相同,順序可以不同。例如[1, true] 與 [false, 2]是相似的。 數組的長度一致。 類型的判斷範圍,需要區分:String, Boolean, Number, undefined, null, 函數,日期, window. 當以上全部滿足,則返回"判定結果:通過",否則返回"判定結果:不通過"。

這是一個奇怪的需求,主要是要求「相似」的判斷。
第一直覺是直接對陣列排序,然後比較類型。但由於JS比較大小的特性,這是不對的。
那麼需要變換一下,我這裡是取每個元素的型別名稱簡寫,這樣可以近似\(O(NlogN)\)排字典序,再將其當作整個陣列的typo,就可以近似\(O(N)\)比較數組是否相似。
第二個要注意的點是對無效參數的判斷,一開始是用== null來判斷nullundefined的,但是要求參數類型為數組,所以用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn