亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

第一章_數據類型_練習題解析

該編程題目主要考察對數據類型判斷的處理。題目要求正確區分基本類型,同時對象類型也有多種區分,所以使用typeof不能滿足條件,需要自己擴展。


以下為一種解法:

/**
?*?String,?Boolean,?Number,?undefined,?null,?函數,日期,?window
?*/
function?arraysSimilar(arr1,?arr2)?{
????//?判斷參數,確保arr1,?arr2是數組,若不是直接返回false
????if?(!(arr1?instanceof?Array)
????????||?!(arr2?instanceof?Array))?{
????????return?false;
????}

????//?判斷長度
????if?(arr1.length?!==?arr2.length)?return?false;

????var?i?=?0,?
????????n?=?arr1.length,?
????????countMap1?=?{},??//?用來計算數組元素數據類型個數的map,key是TYPES中的類型字符串,value是數字表示出現次數。
????????countMap2?=?{},
????????t1,?t2,
????????TYPES?=?['string',?'boolean',?'number',?'undefined',?'null',
????????????'function',?'date',?'window'];

????//?因為是無序的,用一個對象來存儲處理過程。key為類型,?value為該類型出現的次數。
????//?最后校驗:若每一種數據類型出現的次數都相同(或都不存在),則證明同構。
????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;
????????}
????}

????//?因為typeof只能判斷原始類型,且無法判斷null(返回"object"),所以自己寫typeof方法擴展。
????function?typeOf(ele)?{
????????var?r;
????????if?(ele?===?null)?r?=?'null';?//?判斷null
????????else?if?(ele?instanceof?Array)?r?=?'array';??//?判斷數組對象
????????else?if?(ele?===?window)?r?=?'window';??//?判斷window
????????else?if?(ele?instanceof?Date)?r?=?'date'??//?判斷Date對象
????????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;
}


請結合注釋去看就好,有問題回帖。

另外也給網友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());
}


正在回答

15 回答

第二種方法完全不知是啥,不過扎扎實實的先練好第一種吧

0 回復 有任何疑惑可以回復我~

我去,你們這兩種方法對初學者而言 有點天書了 在一個這種題目需要邏輯

0 回復 有任何疑惑可以回復我~

我也覺得先通過排序,然后獲取類型,最后arrType1.toString()和arrType2.toString()一比較就可以了

0 回復 有任何疑惑可以回復我~
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;
????????}
????}

這一段看不懂額,求解釋。。。

0 回復 有任何疑惑可以回復我~
#1

Bosn 提問者

用一個對象, key是類型,value是出現次數。然后遍歷兩個map,如果每一種類型,值(出現次數)都一樣,這樣就得出兩個數組同構。
2015-02-13 回復 有任何疑惑可以回復我~

通過sort()排序將無序變有序,這樣判斷就容易多了

贊。。。

0 回復 有任何疑惑可以回復我~
#1

Bosn 提問者

嗯,再用字符來表示類型,這樣大大縮減了代碼長度。最后就變為了簡單得字符串比較。
2015-01-13 回復 有任何疑惑可以回復我~
#2

cloudwin

表示小菜鳥看不懂第二種寫法
2015-02-06 回復 有任何疑惑可以回復我~
#3

qq_天長_0 回復 Bosn 提問者

表示小菜鳥看不懂第二種寫法
2015-05-13 回復 有任何疑惑可以回復我~
#4

傷心雨后 回復 qq_天長_0

表示菜鳥
2015-07-03 回復 有任何疑惑可以回復我~
#5

追風俠客 回復 Bosn 提問者

6456
2016-01-07 回復 有任何疑惑可以回復我~
#6

追風俠客 回復 qq_天長_0

贊個啊
2016-01-07 回復 有任何疑惑可以回復我~
#7

追風俠客

挺好的
2016-01-07 回復 有任何疑惑可以回復我~
查看4條回復
首頁上一頁12下一頁尾頁

舉報

0/150
提交
取消

第一章_數據類型_練習題解析

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號