2017-05-18 9 views
1

私はローカルデータベースから引き出した配列を持っています。javascript配列をmultidimesionalからassociativeにシフト

var data = [ 
    ['09-08-2017', '62154', 'Approved'], 
    ['09-08-2017', '62155', 'Approved'], 
    ['08-25-2017', '61922', 'Approved'], 
    ['08-25-2017', '61923', 'Approved'], 
    ['08-18-2017', '61949', 'Approved'], 
    // ... 
]; 

...など約250個の異なるエントリについて等である。

data [0] [0]は仕事の曜日であり、それぞれの週は週の金曜日に対応しています。

data [0] [1]はジョブ番号です。各ジョブ番号は一意ですが、週に複数のジョブ番号が存在する可能性があります。

data [0] [2]は、各ジョブ状態が対応するジョブ番号にとどまる必要があるジョブ状態です。

私が本質的にしようとしているのは、配列をそのまま、対応するジョブデータに関連付けられたすべてのジョブ番号と状態を持つシフトされた配列に変換することです。

おそらくこのような何か:

data['09-08-2017'] = ['62154', 'Approved'], ['62155', 'Approved']; 

または

data['09-08-2017'] = { jobNumber: '62154', jobState: 'Approved' }; 

が、私も百パーセントそのような何かを初期化するかどうかはわかりません、と私は可能であればでもオブジェクトそれを変換するためのまともな方法が何であるかはさらにはっきりしない。私は可能な助けやアドバイスのために開いています。前もって感謝します!

編集: 私のアレイが最初に奇妙にフォーマットされていた理由を知りました。私が最初にJavaScriptにPHPから配列を転送する方法を考え出すされたとき、私は誰かが

var data = <?php json_encode(print_r($data)); ?> ; 

を使用していたことがわかりましたので、私はそれをしようとすることを決めた、それが働いていたが、どうやらそれは私に大変だった奇妙な形式を与えました使用する。だから私はもっと研究をして、それを

var data = <?php echo json_encode(array_values($data)); ?>; 

に変更しました。これで動作し、私の配列のフォーマットも簡単になりました。

+3

リテラル表記の配列を追加してください可能性があります。 –

+0

どういう意味ですか?配列はphpからjson_encodeを使ってjavascriptに変換されるので、配列形式を変更する必要がある場合は、それを別のブリッジに渡す必要があります。 – Jeanze

+0

最終結果はどのように見えますか?あなたの例で同じ日付のエントリが複数あるので、あなたが記述したものを持つことはできません( 'data-'09 -08-2017 '= [jobNumber:' 62154、jobState: 'Approved']')。データ。 –

答えて

4

外部配列を反復して配列を変換し、日付を持つ配列を作成できます。次に、新しいオブジェクトを押します。

var data = [['09-08-2017', '62154', 'Approved'], ['09-08-2017', '62155', 'Approved'], ['08-25-2017', '61922', 'Approved'], ['08-25-2017', '61923', 'Approved'], ['08-18-2017', '61949', 'Approved']], 
 
    object = data.reduce(function (r, a) { 
 
     (r[a[0]] = r[a[0]] || []).push({ jobNumber: a[1], jobState: a[2] }); 
 
     return r; 
 
    }, Object.create(null)); 
 

 
console.log(object);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

私はその作業の大部分がその配列を再フォーマットすることだと思います。 :D –

+0

@BertrandMarron、時々、それはopが何を望んでいるのかという疑問が時々あります。 –

+0

それは素晴らしく、私の心を包み込むのは少し難しいですが、私がそれを実装するまで、私はそれを回避します。スニペットは私がそれに必要なものを正確に行います。 – Jeanze

2

JavaScriptは、それがオブジェクトを有し、Map(ES2015のような) "連想配列" を有していません。

配列の配列を日付の後に名前付きのプロパティを持つオブジェクトに変換したいと思うようです。値はジョブ番号と状態のオブジェクトです。その場合は、{}を使用してオブジェクトを作成します。例:

var obj = {}; 

...

obj["09-08-2017"] = {}; 

あなたはオブジェクト初期化子と下位のオブジェクトを作成することができますので、::彼らは有効な識別子名じゃないので、日付の括弧表記で、それらのプロパティを設定

obj[entry[0]] = { 
    jobNumber: entry[1], 
    jobState: entry[2] 
}; 

をしかし、同じ日付のエントリが複数あるため、その構造を持つことはできません。あなたは

{ 
    "08-09-2017": { 
     12345: "Approved", 
     67894: "Approved" 
    } 
} 

例えば:

var data = [ 
 
    ["09-08-2017", 62154, "Approved"], 
 
    ["09-08-2017", 12345, "Approved"], 
 
    ["08-08-2017", 62155, "Approved"] 
 
]; 
 
var obj = {}; 
 
data.forEach(function(entry) { 
 
    var date = entry[0]; 
 
    if (!obj[date]) { 
 
     obj[date] = {}; 
 
    } 
 
    obj[date][entry[1]] = entry[2]; 
 
}); 
 
console.log(obj);

関連する問題