3

私はこのjavascript配列を持っています:

[['a', 'x', 1],
 ['a', 'y', 2],
 ['b', 'x', 3],
 ['b', 'z', 4],
 ['c', 'y', 5],
 ['c', 'z', 6]]

上から2番目の列('x'、'y'、'z')を横切って、下のようなものにピボットするにはどうすればよいですか。

[['a', 1, 2, null],
 ['b', 3, null, 4],
 ['c', null, 5, 6]]

編集:申し訳ありませんが、不明でした。これまでの答えは、x、y、zの静的な長さ/値を参照しているようです。配列は動的であり、2番目の列に何でも含めることができます(例:「x」、「y」、「z」の代わりに「t」、「u」、「v」、「w」)。可能なすべての組み合わせについて、最初に配列をnullで埋めてから、値をプッシュする必要があると思います。

ありがとう..

4

3 に答える 3

2

Fabricioのコメントによると、これが似たようなことを達成する方法です。

var result = {};
for(var i=0;i< basearray.length;i++){
    if(!result[basearray[i][0]]){
        result[basearray[i][0]]={};
    }
    result[basearray[i][0]][basearray[i][1]]=basearray[i][2];
}

これにより、厳密には配列ではなく、オブジェクトまたはハッシュマップが返されますが、データはより整理されており、必要に応じて簡単に配列に変換できることに注意してください。これがデモンストレーションです(コンソールを確認してください)。

このコードを追加することにより:

var count=0;
for(var key in result){
    result[count]=[];
    result[count][0]=key;
    result[count][1]=result[key].x||null;
    result[count][2]=result[key].y||null;
    result[count][3]=result[key].z||null;
    count++;
}

結果オブジェクトは、両方の構造、元の配列の配列、および提案されたキーと値のペアをシミュレートします。ここで結果を見ることができます:http://jsfiddle.net/9Lakw/3/

resultのようになります。

{
   "a":{
      "x":1,
      "y":2
   },
   "b":{
      "x":3,
      "z":4
   },
   "c":{
      "y":5,
      "z":6
   },
   "0":[
      "a",
      1,
      2,
      null
   ],
   "1":[
      "b",
      3,
      null,
      4
   ],
   "2":[
      "c",
      null,
      5,
      6
   ]
}
于 2012-10-24T22:26:53.170 に答える
1

質問のように配列とnullフィラーを使用して、これを行う方法を説明します。これは、与えられたポイントの座標が常に連続して来ることを前提としています。

var arr = [['a', 'x', 1],
 ['a', 'y', 2],
 ['b', 'x', 3],
 ['b', 'z', 4],
 ['c', 'y', 5],
 ['c', 'z', 6]];

var aux = {
        x: 1,
        y: 2,
        z: 3
    },
    output = [],
    lastItem,
    currItem;

for (var i = 0; i < arr.length; i++) {
    currItem = arr[i];
    if (currItem[0] !== lastItem) {
        lastItem = currItem[0];
        output.push([lastItem, null, null, null]);
    }
    output[output.length-1][aux[currItem[1]]] = currItem[2];
}
console.log(output); //[["a", 1, 2, null], ["b", 3, null, 4], ["c", null, 5, 6]]

フィドル

于 2012-10-24T22:31:21.777 に答える
0

それがあなたが望むフォーマットであると確信していますか?以下を取得する方が賢明なようです。

{
    a: {x: 1, y: 2},
    b: {x: 3, z: 4},
    c: {y: 5, z: 6}
}

あなたが得ることができるもの:

var results = {};
data.forEach(function(el) {
    var name = el[0];
    var prop = el[1];
    var value = el[2];
    results[name] = results[name] || {};
    results[name][prop] = value;
})
于 2012-10-24T22:37:03.743 に答える