2012-04-24 18 views
3

私はある順序で組み合わせようとしているいくつかのアラーレイを持っています。たとえば、私は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] 

EDIT

[OK]を、私は誰からいくつかの素晴らしい回答と回答を得ているので、ここで私の話をもう少し追加するつもりです。多分、これはもっと明確になるでしょう。私は私のすべての情報を得ているSharePointリストを持っています。 SPServicesを使用してリストからデータを取得しています。また、各リストアイテムのバージョン履歴を取得して配列に配置するので、SPServicesループからデータを取り出してSharePointの外で使用することができますので、必要に応じて注文して表示することができます。 (これを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; 

:私は私のリスト項目のそれぞれのグローバル変数を宣言しています
$().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から取り出して、それぞれに配列を使用するより良い方法は見つけられませんでした。キッカーは、配列の数や配列の長さを知りません。最終的にこれは動的になるでしょう。 (痛みの痛み)の配列はここにあります:

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です。 –

+0

エントリーによっては、それ以上のものはありません。私は、共有リストに基づいて配列データを取得しています。私が使用している配列のそれぞれは、各アイテムのバージョンを表します。だから、それがユーザーに渡されるとき、どのアレイにどれくらいのアイテムが入るかわからないでしょう。ちょっと私は何をしようとしているのか分かりません。ありがとう – lazoDev

+3

配列の長さが異なる場合はどうなると思いますか?例を挙げることはできますか? – Hristo

答えて

3

編集:サーモンとしてコンパレータを更新すると、-1,0または1が返されるはずです。

以下試してみてください、

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

+1

@ ajax333221あなたはメモを読んだか? OPは彼のポストのデータに言及しましたか?あなたはOPが決して尋ねなかった何かのために失敗したのでdownvoteしましたか? –

+0

具体的なデータはおそらく構成データであり、OPが実際に取り組んでいるものではありません。 –

2

3つの配列の長さは、常にお互いのと同じになります場合は、次の

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 

しかし、あなたの配列は常に同じ長さでない場合、我々は、使用する必要があります3つの配列の最大の長さと不足しているインデックスをスキップし、それはこのようになりますので:

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 

DIFとして(i in arrを使用する理由他のチェックとの比較)は、これによって偽の値0,"",false,null,undefined,NaNをそのまま保持できるためです。それ以外の場合は、私がのコールバックでデフォルトJS sort()方法を使用してお勧めしたい私の答えと現在最もupvoted answer

+0

配列の長さが異なる場合、これは "undefined"をプッシュします...いくつかの小切手を追加することを検討してください – Hristo

+0

@Hristo done :) – ajax333221

+0

あなたは私のもので働いているのでとても感謝します。しかし、それはまだ私のコードのために1a、1b、1c、2a、2b ...などを返しています。理解しています私はできるだけ簡単に説明しようとするために作成されたデータで単純な質問を使用しました。あなたがしたことはちょうど私がそれが元の3つの配列を変更していますが、+1 – lazoDev

1

Performance tests(あなたの配列内の特別undefined値)は、単独でそれらを残すことは非常に難しいだろういくつかの種類。要素が配列のすべて/[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を感謝する必要はありませんが動作しますが、これは問題ではありません – ajax333221

2

in pythonのように、zipの機能を探していると思います。そこビルトイン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)