第一章_數(shù)據(jù)類型_練習(xí)題解析
該編程題目主要考察對(duì)數(shù)據(jù)類型判斷的處理。題目要求正確區(qū)分基本類型,同時(shí)對(duì)象類型也有多種區(qū)分,所以使用typeof不能滿足條件,需要自己擴(kuò)展。
以下為一種解法:
/** ?*?String,?Boolean,?Number,?undefined,?null,?函數(shù),日期,?window ?*/ function?arraysSimilar(arr1,?arr2)?{ ????//?判斷參數(shù),確保arr1,?arr2是數(shù)組,若不是直接返回false ????if?(!(arr1?instanceof?Array) ????????||?!(arr2?instanceof?Array))?{ ????????return?false; ????} ????//?判斷長度 ????if?(arr1.length?!==?arr2.length)?return?false; ????var?i?=?0,? ????????n?=?arr1.length,? ????????countMap1?=?{},??//?用來計(jì)算數(shù)組元素?cái)?shù)據(jù)類型個(gè)數(shù)的map,key是TYPES中的類型字符串,value是數(shù)字表示出現(xiàn)次數(shù)。 ????????countMap2?=?{}, ????????t1,?t2, ????????TYPES?=?['string',?'boolean',?'number',?'undefined',?'null', ????????????'function',?'date',?'window']; ????//?因?yàn)槭菬o序的,用一個(gè)對(duì)象來存儲(chǔ)處理過程。key為類型,?value為該類型出現(xiàn)的次數(shù)。 ????//?最后校驗(yàn):若每一種數(shù)據(jù)類型出現(xiàn)的次數(shù)都相同(或都不存在),則證明同構(gòu)。 ????for?(;?i?<?n;?i++)?{ ????????t1?=?typeOf(arr1[i]); ????????t2?=?typeOf(arr2[i]); ????????if?(countMap1[t1])?{ ????????????countMap1[t1]++; ????????}?else?{ ????????????countMap1[t1]?=?1; ????????} ????????if?(countMap2[t2])?{ ????????????countMap2[t2]++; ????????}?else?{ ????????????countMap2[t2]?=?1; ????????} ????} ????//?因?yàn)閠ypeof只能判斷原始類型,且無法判斷null(返回"object"),所以自己寫typeof方法擴(kuò)展。 ????function?typeOf(ele)?{ ????????var?r; ????????if?(ele?===?null)?r?=?'null';?//?判斷null ????????else?if?(ele?instanceof?Array)?r?=?'array';??//?判斷數(shù)組對(duì)象 ????????else?if?(ele?===?window)?r?=?'window';??//?判斷window ????????else?if?(ele?instanceof?Date)?r?=?'date'??//?判斷Date對(duì)象 ????????else?r?=?typeof?ele;?//?其它的,使用typeof判斷 ????????return?r; ????} ????for?(i?=?0,?n?=?TYPES.length;?i?<?n;?i++)?{ ????????if?(countMap1[TYPES[i]]?!==?countMap2[TYPES[i]])?{ ????????????return?false; ????????} ????} ????return?true; }
請(qǐng)結(jié)合注釋去看就好,有問題回帖。
另外也給網(wǎng)友XadillaX提供的較為精妙的解法:
var?global?=?window; function?arraysSimilar(arr1,?arr2){ ????return?(arr1?instanceof?Array?&&?arr2?instanceof?Array)?&&?JSON.stringify(arr1.map(function(v)?{ ????????return?null?===?v???"?"?:?(v?instanceof?Date???"?"?:?(v?===?global???"?"?:?typeof?v)); ????}).sort())?===?JSON.stringify(arr2.map(function(v)?{ ????????return?null?===?v???"?"?:?(v?instanceof?Date???"?"?:?(v?===?global???"?"?:?typeof?v)); ????}).sort()); }
2015-03-24
第二種方法完全不知是啥,不過扎扎實(shí)實(shí)的先練好第一種吧
2015-03-04
我去,你們這兩種方法對(duì)初學(xué)者而言 有點(diǎn)天書了 在一個(gè)這種題目需要邏輯
2015-02-15
我也覺得先通過排序,然后獲取類型,最后arrType1.toString()和arrType2.toString()一比較就可以了
2015-02-05
這一段看不懂額,求解釋。。。
2015-01-13
通過sort()排序?qū)o序變有序,這樣判斷就容易多了
贊。。。