2012-04-24 65 views
3

我有幾個數組,我試圖按特定順序組合。例如,假設我有三個陣列:按訂單組合數組JavaScript

var arrayOne = [1a, 1b, 1c]; 
var arrayTwo = [2a, 2b, 2c]; 
var arrayThree [3a, 3b, 3c]; 

我該如何得到這樣的東西?

var combinedArray = [1a, 2a, 3a, 1b, 2b, 3b, 1c, 2c, 3c] 

編輯

好了,我要多一點這添加到我的故事,因爲我已經得到了來自大家一些偉大的迴應和解答。也許這會更清楚。我有一個SharePoint列表,我從中獲取所有信息。我正在使用SPServices從列表中獲取我的數據。我還獲取每個列表項的版本歷史記錄,並將它們放入數組中,以便我可以將數據從SPServices循環中提取出來,並在SharePoint外部使用它,以便我可以嘗試按照我的意願進行排序和顯示。 (請勿將其移至SharePoint)。 這一切都必須在運行時發生。所以這是第一部分。我聲明我的列表項中的每一個全局變量:

var proModified6 = new Array(); 
var proHistory = new Array(); 
var assignedTo = new Array(); 
var startDate = new Array(); 
var endDate = new Array(); 
var status = new Array(); 
var project = new Array(); 
var history = new Array(); 


var listItems = new Array(); 


var regex = new RegExp(""); 

var i = 0; 

那麼我填充SharePoint列表信息的陣列(我不會把他們所有,但每個人都有這樣一個呼叫)

$().SPServices({ 
    operation: "GetVersionCollection", 
     async: false, 
     webURL: "http://devchrisl01/test", 
     strlistID: "NewProjects", 
     strlistItemID: proID[i], 
     strFieldName: "Title",   

     completefunc: function (xdata, Status) { 

     $(xdata.responseText).find("Version").each(function() { 

     //alert(xdata.responseXML.xml); 

     var xitem = $(this); 
      var ID = xitem.attr('ID'); 
      var Project = xitem.attr('Title'); 
      var Modified = xitem.attr('Modified').split('T')[0]; 
      var ModifiedTime = xitem.attr('Modified').substring(11, 19); 
      //var modifiedUl = "<td><b>" + Modified + " " + ModifiedTime + "</b></td>"; 
    //$('#versionList'+i+'').append(modifiedUl); 

        project.push(Project); 
        proModified2.push(Modified + ModifiedTime) 


    // just looking at my data here not really part of my problem  
var data = "<tr><td><b>" + Modified + " " + ModifiedTime + "</b></td><td>" + Project + "</td></tr>"; 


$('#versionList'+i+'').append(data); 

     }); 

     } 

}); 

以後是我的問題發揮的地方。我正在將我需要的所有數據恢復。我還沒有找到更好的方法來存儲所有的列表信息,並將其從SPServices中除了使用每個數組之外。踢球者是我不知道會有多少陣列或多久。最終這將是動態的。 (PAIN IN ASS)所以這裏是陣列:

var modifiedDate = [proModified1, proModified2, proModified3, proModified4, proModified5, proModified6]; 
var projectHistory = [history]; 
var projectTitle = [project]; 
var projectAssignedTo = [assignedTo]; 
var projectStartDate = [startDate]; 
var projectEndDate = [endDate]; 
var projectStatus = [status]; 

每一個都會有所不同。對於每個用戶來說,它們的數量不會相同。我剛剛將我的列表靜態化爲首先構建。列表動態將在以後的另一個問題:0

是否會有我的方式來處理這些數組,就像我在我的簡單示例中問?看看我爲什麼簡單的第一次哈哈。

+0

數組長度是否總是相同?這裏是3例如 – 2012-04-24 19:45:48

+0

根據條目,沒有一些會更小或更大。我從基於SharePoint的列表中獲取陣列數據。我使用的每個陣列都代表每個項目的版本。所以當它交給用戶時,我不知道每個陣列中有多少物品。有點長期的探索:)只是試圖給你一個我想要做的事情的想法。謝謝 – lazoDev 2012-04-24 19:49:20

+3

如果陣列的長度不同,你會發生什麼事......你能舉個例子嗎? – Hristo 2012-04-24 19:50:57

回答

3

編輯:作爲鮭魚指出,它應該返回-101更新比較。

嘗試以下,

var arrayOne = ["1a", "1b", "1c"]; 
var arrayTwo = ["2a", "2b", "2c"]; 
var arrayThree = ["3a", "3b", "3c"]; 

var combinedArray = arrayOne 
    .concat(arrayTwo, arrayThree) //Concatenate the array.. can add any number of arrays 
    .sort(function(a, b) { //Custom comparator for your data 
     var a1 = a.charAt(1); 
     var b1 = b.charAt(1); 

     if (a1 == b1) return 0; 
     if (a1 < b1) return -1; 
     return 1; 
    }); 

注:自定義比較功能是非常具體的數據。根據需要更新功能。

DEMO

+0

你的代碼應該用這個值http://jsfiddle.net/NzuBL/1/生成'xa,ya,za,xb,yb,zb,xc,yc,zc',但它返回'xa,xb,xc,ya ,yb,yc,za,zb,zc' – ajax333221 2012-04-24 19:53:58

+1

@ ajax333221您是否閱讀過註釋? OP是否在他的文章中提到了這些數據?你是否因爲它從未要求過的東西而失敗? – 2012-04-24 19:55:07

+0

恐怕具體數據可能是製作好的數據,而不是OP實際上正在處理的內容。 – 2012-04-24 19:56:59

2

如果三個數組的長度將永遠是彼此相同的:

var arrayOne = ["1a", "1b", "1c"]; 
var arrayTwo = ["2a", "2b", "2c"]; 
var arrayThree = ["3a", "3b", "3c"]; 

var newArray = []; 
for (var i = 0, len = arrayOne.length; i < len; i++) { 
    newArray.push(arrayOne[i], arrayTwo[i], arrayThree[i]); 
} 

console.log(newArray); //1a,2a,3a,1b,2b,3b,1c,2c,3c 

但是如果你的數組不會總是相同的長度,我們將需要使用三個陣列的最大長度,並跳過缺少的索引,所以這將是這樣的:

var arrayOne = ["1a", "1b", "1c", "1d"]; 
var arrayTwo = ["2a", "2b", "2c"]; 
var arrayThree = ["3a", "3b"]; 

var newArray = []; 
var len = Math.max(arrayOne.length, arrayTwo.length, arrayThree.length); 

for (var i = 0; i < len; i++) { 
    if (i in arrayOne) { 
     newArray.push(arrayOne[i]); 
    } 
    if (i in arrayTwo) { 
     newArray.push(arrayTwo[i]); 
    } 
    if (i in arrayThree) { 
     newArray.push(arrayThree[i]); 
    } 
} 

console.log(newArray); //1a,2a,3a,1b,2b,3b,1c,2c,1d 

之所以用i in arr(如DIF因爲這會讓你保持任何虛假價值0,"",false,null,undefined,NaN完好無損。否則,將很難獨自離開他們(你的陣列裏專門undefined值)

Performance tests我的答案之間,以及目前最upvoted answer

+0

如果數組長度不同,這會推送「未定義」...考慮添加一些檢查 – Hristo 2012-04-24 19:55:21

+0

@Hristo做:) – ajax333221 2012-04-24 20:11:15

+0

你後我的工作與我的東西,所以謝謝;然而,它仍然返回1a,1b,1c,2a,2b ....等等。理解我用數據編寫簡單的問題來嘗試儘可能簡單地解釋。你所做的工作並不是我需要它,謝謝+1 – lazoDev 2012-04-25 13:48:50

1

我建議使用默認的JS sort()法的回調某種。如果元素,如果數組都喜歡/[0-9][a-z]/,這會給你想要的結果:

//concat arrays first, of course 
function specialSort(a,b) 
{ 
    if(a[1] < b[1]) 
    { 
     return -1; 
    } 
    if(a[1] > b[1]) 
    { 
     return 1; 
    } 
    return 0; 
} 
//using wsanville's expample: combinedArray = ["1a", "1b", "1c", "2a", "2b", "2c", "3a", "3b", "3c"] 
combinedArray = combinedArray.sort(specialSort); 
//result: combinedArray = ["1a", 2a", "3a", "1b", "2b", "3b", "1c", "2c", "3c"] 

希望這對你的作品...

1

你可以簡單地做:

var arrayOne = ["1a", "1b", "1c"]; 
var arrayTwo = ["2a", "2b", "2c", "2d", "2e"]; 
var arrayThree = ["3a", "3b", "3c", "3d"]; 
var combinedArray = []; 

for (var i = 0, j = Math.max(arrayOne.length, arrayTwo.length, arrayThree.length); i < j; i++) { 
    if (arrayOne.length) combinedArray.push(arrayOne.shift()); 
    if (arrayTwo.length) combinedArray.push(arrayTwo.shift()); 
    if (arrayThree.length) combinedArray.push(arrayThree.shift()); 
} 

alert(combinedArray.join(", "));​ 

這可能適用於可變長度數組。 Demo here

+0

+1,雖然這是修改原來的3個陣列,但這不應該是一個問題 – ajax333221 2012-04-24 21:03:12

2

從我的理解中,您正在尋找zip函數,如in python。有沒有這樣的內置的JavaScript,但它很容易寫,例如:

zip = function() { 
    var 
     args = [].slice.call(arguments, 0), 
     len = Math.max.apply(Math, args.map(function(x) { return x.length })), 
     out = []; 
    for (var i = 0; i < len; i++) 
     out.push(args.map(function(x) { return x[i] })); 
    return out; 
} 

適用於您的陣列

var arrayOne = ["1a", "1b", "1c"]; 
var arrayTwo = ["2a", "2b", "2c"]; 
var arrayThree = ["3a", "3b", "3c"]; 

zipped = zip(arrayOne, arrayTwo, arrayThree); 

這將創建一個嵌套的數組:

[["1a", "2a", "3a"], ["1b", "2b", "3b"], ["1c", "2c", "3c"]] 

這您可以按原樣使用或將其轉換爲平面:

flat = [].concat.apply([], zipped)