3

特定の順序で組み合わせようとしているいくつかの延滞があります。たとえば、3つの配列があるとします。

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から引き出すためのより良い方法を見つけられませんでした。キッカーは、アレイがいくつあるのか、どれくらいの長さになるのかわからないということです。最終的に、これは動的になります。(お尻の痛み)だからここに配列があります:

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

簡単な例で尋ねたように、これらの配列を使用する方法はありますか?なぜ私が最初に単純になったのか見てください笑。

4

5 に答える 5

3

-1編集:Salmonが、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;
    });

注:カスタムコンパレータ機能は、データに非常に固有です。必要に応じて関数を更新してください。

デモ

于 2012-04-24T19:48:35.710 に答える
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

(他のチェックの違いとして)使用する理由は、これにより、偽の値をそのままi in arr維持できるためです。0,"",false,null,undefined,NaNそうしないと、それらをそのままにしておくのが非常に困難になります(特にundefined配列内の値)

私の回答と現在最も賛成されている回答の間のパフォーマンステスト

于 2012-04-24T19:51:16.427 に答える
2

私の理解では、Pythonzipのような関数を探しています。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)
于 2012-04-24T20:07:43.720 に答える
1

sort()ある種のコールバックでデフォルトのJSメソッドを使用することをお勧めします。配列の要素がすべてのような場合/[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"]

これがあなたのために働くことを願っています...

于 2012-04-24T19:57:54.573 に答える
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(", "));​

これはおそらく可変長配列で機能するはずです。ここでデモ

于 2012-04-24T20:06:12.420 に答える