2014-01-26 88 views
1

我有一個函數來過濾重複和空白空間CSS類,但我的函數出口陣列,空的空間反正...功能附加空間陣列項目

var classes = function (className, current) { 
    var classNames = [className], uniques = {}; 
    if(current) classNames = classNames.concat(current.split(' ')); 
    return classNames.filter(function (className,i) { 
     if(className == "") return; 
     className = className.match(/\S+/)[0]; 
     if (!uniques[className]) return uniques[className] = className; 
    }); 
}; 

當我運行classes(' foo')我得到[" foo"]反正有一個空的空間, 雖然console.log(' foo'.match(/\S+/)[0];返回'foo'沒有空間。

我錯過了什麼?

Fiddle

+1

究竟你想達到什麼目的?請提供更多背景。 – undefined

+0

@BlackSheep,謝謝你看這個。我想把''foo''傳入這個函數,並返回一個乾淨的'['foo']'沒有空格。我認爲我做了一切正確的事情,但是在某處添加了一個空白空間,我找不到... – Rikard

回答

4

你誤解如何filter作品。 fine manual

filter()方法創建一個新的數組,其中包含所有通過由提供的函數實現的測試的元素。

從回調返回值告訴filter它的classNames元件應被通過,返回值被僅僅測試感實性。 filter不會返回回調的返回值,classNames的原始未觸及值是。所以問題不在於增加額外的空間,問題是沒有任何東西可以去除空間。

如果你想測試,並在同一時間修改,然後reduce將更好地爲您服務:

return classNames.reduce(function(a, className) { 
    if(!className) 
     return a; 
    className = className.match(/\S+/)[0]; 
    if(!uniques[className]) { 
     a.push(className); 
     uniques[className] = className; 
    } 
    return a; 
}, []); 

注意所有return a;陳述和缺乏return;秒。

演示:http://jsfiddle.net/ambiguous/bw3JS/

你也可以使用map清理空間,然後filter像這樣的東西清理undefined S:

return classNames.map(function(className) { 
    if(!className) 
     return; 
    className = className.match(/\S+/)[0]; 
    if(!uniques[className]) 
     return uniques[className] = className; 
}).filter(function(className) { 
    return typeof className !== 'undefined'; 
}); 

演示:http://jsfiddle.net/ambiguous/8j5Bb/

+0

啊哈...明白了......我正在改變'.filter( )'這是無形的。良好的接觸和感謝您的替代解決方案! – Rikard

+0

我提出'.map()'也是一個解決方案。 (?) – Rikard

+0

你可以使用'map',但是每個從'map'回調中返回的值都會在最後一個數組中結束。 'map'會給你帶來'undefined'值或者空字符串或者其他值,你需要單獨的'filter'來清理:http://jsfiddle.net/ambiguous/8j5Bb/ –