2010-10-04 106 views
0

考慮以下數組:javascript數組排序?

var things = ['sandwich', 17, '[email protected]', 3, 'horse', 'octothorpe', '[email protected]', '[email protected]']; 

排序陣列分爲三個他人號碼之一,字符串之一,並且有效的電子郵件地址之一。丟棄無效的地址。

+4

做你自己的作業... – 2010-10-04 21:35:57

+0

做結果數組必須自己排序..? – 2010-10-04 21:39:16

+0

@Josh,或者至少*標記*作爲家庭作業......另外,我們應該如何從兩個數組中得到三個數字? – 2010-10-04 21:41:07

回答

1
var emails = [], strings = [], numbers = []; 

things.forEach(function (e) { 
    if (typeof e == "string") { 

     if (e.indexOf("@") != -1) { // "looks" like an email if it contains @ 
      if (isEmail(e)) emails.push(e); // push if it is a valid email 
     } 

     else strings.push(e); 
    } 

    else if (typeof e == "number") { 
     numbers.push(e); 
    } 
}); 

function isEmail(str) { return /** true if str is a valid email **/ } 

我會離開它給你拿出一個正確的isEmail功能。

1

你需要的是使用Array對象的過濾函數。

例子:

function isBigEnough(element, index, array) { 
    return (element >= 10); 
} 
var filtered = [12, 5, 8, 130, 44].filter(isBigEnough); 

你需要寫3個自定義過濾功能爲每個需要的陣列。

前兩個條件是微不足道的,對於第三個條件,我建議選擇一個正則表達式來滿足您的驗證郵件的要求。一個短的將是^[A-Z0-9._%+-][email protected][A-Z0-9.-]+\.[A-Z]{2,4}$

問候, 阿林

+0

+1很好的答案。讓OP在沒有給予他的情況下繼續下去。 – 2010-10-04 21:45:53

0
(function(arr) { 
    var a = [], b = [], c = []; 
    for (var i = 0; i < arr.length; i += 1) { 
     if (typeof arr[i] === "number") { 
      a.push(arr[i]); 
     } else if (isValidEmail(arr[i])) { 
      b.push(arr[i]); 
     } else if (typeof arr[i] === "string") { 
      c.push(arr[i]); 
     } 
    } 
    return [a, b, c]; 
}()); 

isValidEmail(s)返回true,如果該參數是表示有效電子郵件的字符串。你是最好的使用這個正則表達式的...

順便說一句,你用這樣的方式,分配上述表達式給一個變量,然後將此變量包含三個數組作爲其項目...

+0

您將a,b,c分配給同一個數組。您需要爲每個數組指定一個新的實例,否則您將推送到內存中的同一個數組。 – 2010-10-04 21:49:32

+0

更正。謝謝你指出。 – 2010-10-04 21:51:43