2015-11-17 59 views
0

這可能是一個非常簡單的問題,可能以前已經回答過,但我已經研究過它,但找不到任何東西。如果我運行下面的代碼:將多個元素從數組中調用的函數添加到數組中?

function addElements(arg1,arg2){ 
    return ['b','c']; 
} 

var arr = ['a',addElements('foo','bar'),'d']; 
alert(JSON.stringify(arr)); 

然後我得到一個數組是這樣的:

['a',['b','c'],'d'] 

我怎樣才能讓它在創建一個一維數組這樣

['a','b','c','d'] 

謝謝,

Joe

+0

我很好奇,爲什麼你會在數組定義的中間執行一個匿名函數... –

+1

var arr = ['a','b','c','d']; ? – Chad

+1

你想要完成什麼? –

回答

2

如果你堅持保留這種格式,你可以使用concat

var arr = ['a'].concat(function(){ 
    return ['b','c']; 
}(), 'd'); 
alert(JSON.stringify(arr)); 

一個清潔的方法,並解釋:

// initial array 
var arr = ['a']; 

// use your function to add data to array 
arr = arr.concat(function(){ 
    return ['b','c']; 
}()); 

// add more values 
arr.push('d'); 
+0

@SzabolcsPáll我假設OP不想創建一個有4個常量的數組。他們可能想要生成值來動態插入數組,並創建一個常量的例子... – Macmee

+0

我不能(很容易)做到這一點,因爲這是在一個非常大的JSON塊內。儘管如此,第一種方式仍然可行,謝謝。 – JoeS

+0

爲什麼不''[] .concat('a',function(){return ['b','c'];}(),'d');'? –

2

您可以使用Array.prototype.reduce()

reduce()方法適用的功能針對累加器和數組的每個值(從左到右)將其減少爲單個值。

組合

Array.prototype.concat()

concat()方法返回包括在其上它被稱爲加入了與作爲參數提供的陣列(一個或多個)和/或值(S)陣列的新的數組。

var arr = ['a', function() { return ['b', 'c']; }(), 'd'], 
 
    arr2 = arr.reduce(function (r, a) { 
 
     return r.concat(a); 
 
    }, []); 
 

 
document.write('<pre>' + JSON.stringify(arr2, 0, 4) + '</pre>');

或者使用Array.prototype.map()

map()方法創建調用此陣列中的每個元件上的提供功能的結果的新的數組。

var arr = ['a', function() { return ['b', 'c']; }(), 'd'], 
 
    arr2 = []; 
 

 
arr.map(function (a) { 
 
    arr2 = arr2.concat(a); 
 
}); 
 
document.write('<pre>' + JSON.stringify(arr2, 0, 4) + '</pre>');

+0

有趣的方法(我忘記了減少),但我想像一個單一的直接concat會更快/更少的代碼。 – JoeS

0

我假設你所要求的,可以包含內部陣列陣列的數據結構的通用解決方案,並希望將其壓平。

你基本上需要一個遞歸方法,這樣做,如果是的話,即:

function flattenArr(arr) { 
    var outArr = []; 
    for (var i = 0; i < arr.length; ++i) { 
     if (Array.isArray(arr[i])) { 
      outArr = outArr.concat(flattenArr(arr[i])); 
     } else { 
      outArr.push(arr[i]); 
     } 
    } 
    return outArr; 
}