5

私は午前中ずっとこれをいじり、ここを読んでいましたが、ぐるぐる回っていることに気づきました!

優れたJavascriptチャートを使用してチャートを描画しようとしてAmChartsいます.棒グラフとして株式保有を示し、折れ線グラフとして株式回転を示します.

データベースへの 1 つのクエリから両方のデータ セットを取得することはできず、AmCharts StockChart は時間ベースのデータではないため使用できません。したがって、Javascript と組み合わせる必要がある 2 つのデータ セットがあります。

データはデータベースから取得され、次のような JSON 配列として正常に返されます。

販売データ:

[{"brandName":"Fender","gearShiftedPerMonth":"35","retailSalesPerMonth":"55"},
 {"brandName":"Gibson","gearShiftedPerMonth":"23","retailSalesPerMonth":"43"},
 {"brandName":"Epiphone","gearShiftedPerMonth":"10","retailSalesPerMonth":"13"}]

在庫データ:

[{"brandName":"Gibson","stockValue":"1234"},
 {"brandName":"Fender","stockValue":"975"},
 {"brandName":"Epiphone","stockValue":"834"}]

明らかに、実際の数値はその例で構成されています!

今、私がする必要があるのは、これらを組み合わせてこれを作成することです:

結合データ

[{"brandName":"Fender","gearShiftedPerMonth":"35","retailSalesPerMonth":"55","stockValue":"975"},
 {"brandName":"Gibson","gearShiftedPerMonth":"23","retailSalesPerMonth":"43","stockValue":"1234"},
 {"brandName":"Epiphone","gearShiftedPerMonth":"10","retailSalesPerMonth":"13","stockValue":"834"}]

stockValueそこにあるのは、対応する brandName レコードに追加された追加データを追加するための Stock Dataset と結合された Sales Datasetです。

使用してみ$.extendましたが、この状況での使用方法がわかりません。

データ ペアが必ずしも正しい順序であるとは限らないことに注意することがおそらく重要です。また、可能性は低いですが、一致しない可能性もあるため、何らかのゼロ化エラー キャッチを実装する必要があります。

4

4 に答える 4

4

最初に行う必要があるのは、データを 2 つのオブジェクトに変換することです。これらのオブジェクトのプロパティは、マージする値です。

{
"Fender" : {"gearShiftedPerMonth":"35","retailSalesPerMonth":"55"},
"Gibson" : {"gearShiftedPerMonth":"23","retailSalesPerMonth":"43"},
"Epiphone" : {"gearShiftedPerMonth":"10","retailSalesPerMonth":"13"}
}

{
"Gibson": {"stockValue":"1234"},
"Fender": { "stockValue":"975"},
"Epiphone": { "stockValue":"834"}
}

$.extend変換が完了すると、または他の関数を使用してマージできる 2 つのオブジェクトができます。

アップデート

大規模なセットの場合、これはほぼ線形時間で結果を返します。

var salesa = {}, stocka = {};
$.each(sales, function(i, e) {
    salesa[e.brandName] = e;
});
$.each(stock, function(i, e) {
    stocka[e.brandName] = e;
});

var combine = {};
$.extend(true, combine, salesa, stocka)

$each(stock...別の呼び出しではなく、2 番目の変換コールバック ( ) 中にマージが発生した場合は、さらに速度を調整できますが$.extend()、その明白さの一部が失われます。

于 2012-07-31T13:41:02.653 に答える
2

サンプルコードが現実を反映している場合、jQuery$.extendはこれには不適切なツールになります。

あるオブジェクトから別のオブジェクトにデータを盲目的にコピーします。データの順序が一貫していないことに注意してください。SALES DATA がFender最初で、STOCK DATA がgibson最初です。

したがって、jQuery$.extendは 2 つの結果を混合しています。の「gearShifted」と「retailSales」Fenderは、の「brandName」と「stockValue」になりGibsonます。


必要なのは、1 つの配列を反復処理し、もう 1 つの配列で「brandName」を検索してから、必要なデータをコピーすることです。$.extendよろしければ、その部分に使用できます...

var sales_data = 
[{"brandName":"Fender","gearShiftedPerMonth":"35","retailSalesPerMonth":"55"},
 {"brandName":"Gibson","gearShiftedPerMonth":"23","retailSalesPerMonth":"43"},
 {"brandName":"Epiphone","gearShiftedPerMonth":"10","retailSalesPerMonth":"13"}]

var stock_data = 
[{"brandName":"Gibson","stockValue":"1234"},
 {"brandName":"Fender","stockValue":"975"},
 {"brandName":"Epiphone","stockValue":"834"}]

var combined = $.map(sales_data, function(obj, i) {

    return $.extend({}, obj, $.grep(stock_data, function(stock_obj) {
        return obj.brandName === stock_obj.brandName
    })[0]);
});

これは非常に効率的ではないことに注意してください。ただし、データ セットが膨大でない限り、問題になることはありません。


デモ: http://jsfiddle.net/sDyKx/

結果:

[
    {
        "brandName": "Fender",
        "gearShiftedPerMonth": "35",
        "retailSalesPerMonth": "55",
        "stockValue": "975"
    },
    {
        "brandName": "Gibson",
        "gearShiftedPerMonth": "23",
        "retailSalesPerMonth": "43",
        "stockValue": "1234"
    },
    {
        "brandName": "Epiphone",
        "gearShiftedPerMonth": "10",
        "retailSalesPerMonth": "13",
        "stockValue": "834"
    }
]
于 2012-07-31T14:09:56.607 に答える
2

彼がやろうとしているのは、2 つのデータセットをあたかもテーブルであるかのように結合し、brandName で結合することだと思います。私がテストしてきたことから、jQuery の $.extend() 関数はそれを処理しませんが、受信したオブジェクト配列のインデックスに従ってオブジェクトをマージします。

キーのマッチングは手動で行う必要があると思います。

stock = [{"brandName":"Fender","gearShiftedPerMonth":"35","retailSalesPerMonth":"55"},
 {"brandName":"Gibson","gearShiftedPerMonth":"23","retailSalesPerMonth":"43"},
 {"brandName":"Epiphone","gearShiftedPerMonth":"10","retailSalesPerMonth":"13"}];
value = [{"brandName":"Gibson","stockValue":"1234"},
 {"brandName":"Fender","stockValue":"975"},
 {"brandName":"Epiphone","stockValue":"834"}];

var results = [];
$(stock).each(function(){
    datum1 = this;
    $(value).each(function() {
        datum2 = this;
        if(datum1.brandName == datum2.brandName)
            results.push($.extend({}, datum1, datum2));
    });
});

その結果、次のようになります。

[{"brandName":"Fender","gearShiftedPerMonth":"35","retailSalesPerMonth":"55","stockValue":"975"},
{"brandName":"Gibson","gearShiftedPerMonth":"23","retailSalesPerMonth":"43","stockValue":"1234"},
{"brandName":"Epiphone","gearShiftedPerMonth":"10","retailSalesPerMonth":"13","stockValue":"834"}]

$.extend()の使用が返すものの代わりに:

[{"brandName":"Gibson","gearShiftedPerMonth":"35","retailSalesPerMonth":"55","stockValue":"1234"},
{"brandName":"Fender","gearShiftedPerMonth":"23","retailSalesPerMonth":"43","stockValue":"975"},
{"brandName":"Epiphone","gearShiftedPerMonth":"10","retailSalesPerMonth":"13","stockValue":"834"}]
于 2012-07-31T14:12:48.663 に答える
1

バニラJavaScriptでは、次のことができます:

var sales = [{"brandName":"Fender","gearShiftedPerMonth":"35","retailSalesPerMonth":"55"},
 {"brandName":"Gibson","gearShiftedPerMonth":"23","retailSalesPerMonth":"43"},
 {"brandName":"Epiphone","gearShiftedPerMonth":"10","retailSalesPerMonth":"13"}];

var stock = [{"brandName":"Gibson","stockValue":"1234"},
 {"brandName":"Fender","stockValue":"975"},
 {"brandName":"Epiphone","stockValue":"834"}];

var combined = stock.slice(0);     

for (var i = 0; i < stock.length; i++) {
    for (var j = 0; j < sales.length; j++) {
        if (stock[i].brandName === sales[j].brandName) {
            for (var attrname in sales[j]) { combined[i][attrname] = sales[j][attrname]; }
        }
    }
}

JSON.stringify(combined)

生産する

[
{"brandName":"Gibson","stockValue":"1234","gearShiftedPerMonth":"23","retailSalesPerMonth":"43"},
{"brandName":"Fender","stockValue":"975","gearShiftedPerMonth":"35","retailSalesPerMonth":"55"},
{"brandName":"Epiphone","stockValue":"834","gearShiftedPerMonth":"10","retailSalesPerMonth":"13"}
]
于 2012-07-31T13:57:19.623 に答える