2011-10-24 102 views

回答

53

您可以使用jQuery.map,這就是如果你有jQuery庫已經加載的路要走。

$.map([1, 2, [3, 4], [5, 6], 7], function(n){ 
    return n; 
}); 

返回

[1, 2, 3, 4, 5, 6, 7] 
+5

當然,這是它在問題中的表述方式,但是,這也只會使一個層次變平。 – phil

4

您可以使用jQuery.map()

回調(值,indexOrKey)來處理每個項目 反對的功能。函數的第一個參數是值;第二個參數 是數組或對象屬性的索引或鍵。函數 可以返回任何值以添加到數組中。 返回的數組 將平鋪到結果數組中。在該函數中,這個 引用全局(窗口)對象。

11
var a = [1, 2, [3, 4], [5, [6, [7, 8]]]]; 
var b = []; 

function flatten(e,b){ 
    if(typeof e.length != "undefined") 
    { 
     for (var i=0;i<e.length;i++) 
     { 
      flatten(e[i],b); 
     } 
    } 
    else 
    { 
     b.push(e); 
    } 
} 
flatten(a,b); 
console.log(b); 

平化功能應該這樣做,而這並不需要jQuery的。只需將所有這些複製到Firebug並運行即可。

+0

我應該補充說,這不僅會使數組扁平化,而且會使「長度」方法變成任何東西。除非聲明爲新的Array(),否則在Javascript中確實不可能確定某些東西是真正的數組。 – dnuttle

+0

dnuttle:實際上,我認爲使用'obj instanceof Array'幾乎可以工作。 (除非另有一個名爲Array的變量,那麼你可以使用'obj instanceof [] .constructor') – 2011-10-24 17:58:40

+0

嗯。你是對的。我可以發誓我以前曾嘗試過,並沒有奏效。 – dnuttle

33

使用JavaScript的力量:

var a = [[1, 2], 3, [4, 5]]; 

console.log(Array.prototype.concat.apply([], a)); 
//will output [1, 2, 3, 4, 5] 
+3

如果你只有數組嵌套深度一個數組,如果你有一個數組 – dnuttle

+1

@dnuttle當然,但這個條件沒有在問題中說明 – bjornd

+28

-1不夠jQuery(笑話) – JiminP

20

這裏是你如何可以使用jQuery扁平化深度嵌套的數組:

$.map([1, 2, [3, 4], [5, [6, [7, 8]]]], function recurs(n) { 
    return ($.isArray(n) ? $.map(n, recurs): n); 
}); 

返回:

[1, 2, 3, 4, 5, 6, 7, 8] 

利用的jQuery.map作爲以及jQuery.isArray

0

老問題,我知道,但是...

我發現這個工作的,是快:

function flatten (arr) { 
    b = Array.prototype.concat.apply([], arr); 
    if (b.length != arr.length) { 
    b = flatten(b); 
    }; 

    return b; 
} 
+2

最好在''b = ....''代碼中加一個'var'來避免額外的全局變量。 –

5

要遞歸扁平化的數組,你可以使用本機Array.reduce功能。沒有必要爲此使用jQuery。

function flatten(arr) { 
    return arr.reduce(function flatten(res, a) { 
     Array.isArray(a) ? a.reduce(flatten, res) : res.push(a); 
     return res; 
    }, []); 
} 

執行

flatten([1, 2, [3, 4, [5, 6]]]) 

回報

[ 1, 2, 3, 4, 5, 6 ] 
+0

值得注意的是,它的工作原理,但僅適用於現代瀏覽器(除非已被修補) –

0

,如果你有多個級別使用遞歸:

flaten = function(flatened, arr) { 
    for(var i=0;i<arr.length;i++) { 
     if (typeof arr[i]!="object") { 
      flatened.push(arr[i]); 
     } 
     else { 
      flaten(flatened,arr[i]); 
     } 
    } 
    return; 
} 

a=[1,[4,2],[2,7,[6,4]],3]; 
b=[]; 
flaten(b,a); 
console.log(b); 
1

您可以使用Array.prototype.reduce這在技術上是不Ĵ查詢,但有效的ES5:

var multidimensionArray = [1, 2, [3, 4], [5, 6], 7]; 
var initialValue = []; 

var flattened = multidimensionArray.reduce(function(accumulator, current) { 
    return accumulator.concat(current); 
}, initialValue); 

console.log(flattened);