2014-05-13 115 views
0

我有用json對象打印到html數組的問題。即時通訊使用原來的代碼是這樣的javascrit對象,它是「購物車」按jQuery對象的數組按jQuery對象的數組

var ShoppingCart = { 
    Id: 1, 
    ShoppingCartItems: [] //array with json objects 
}; 

並在「ShoppinCartItems」

{Id:1,ShoppingCartItems:[{ProductID:"9",Quantity:"2",Price:"68.40",Name:"Cake",Date:"2014-05-30",StoreID:"1",UserID:"1"},{ProductID:"7",Quantity:"1",Price:"11.40",Name:"Donut",Date:"2014-05-30",StoreID:"1",UserID:"1"}]} 

(我不知道數組,如果這是因爲IM有效使用示例)。

因此,對於這個json對象數組,我希望在這些值按日期顯示html displayin中顯示一個表。即時通訊使用實際的代碼是這樣的:

$.each(ShoppingCart.ShoppingCartItems, function (i, Productos) { 
    $(".cart").append("\ 
    <tr style='background-color: #F1F1F1; border-bottom: 3px solid #fff;'>\ 
    <td style='width: 10%;'>" + Number(Productos.Quantity) + "</td>\ 
    <td style='width: 33%'>" + Productos.Name + "</td>\ 
    <td style='width: 33%'>" + (Productos.Date || 'N/A') + "</td>\ 
    <td style='width: 20%'>" + Productos.Price + "</td>\ 
         </tr>"); 
}); //each 

但不幸的是,結果會是這樣

Qty   Name   Price 
2014-05-30 
2    Cake   68 
2014-05-30  
1    Donut   10 (e.g.) 

而結果我想是這樣的

Qty   Name   Price 
May 30, 2014 
2    Cake   68 
1    Donut   10 (e.g.) 
--- 
May 31, 2014 
1    Other product 10.00 

我想分組的產品按日期,但我無法設法從每個產品的JSON數組分組,我不知道哪個是bes解決方案,希望有人可以幫助我

謝謝

+0

是按該日期排序的項目嗎? –

+0

感謝您的回覆,每個項目都有自己的日期。功能是用戶選擇一個日期(例如從datepicker),並且他們選擇的每個產品都會有這個日期(例如2014-05-13),在這種情況下是今天的日期。 –

+0

感謝您的幫助,我會嘗試瞭解代碼,因爲作爲非英語發言者對理解說明有點困難。正如德里克所說,另一個答案有解決方案,但我會試着去看看我能做些什麼。 –

回答

0

我認爲,所有你需要做的就是按日期排序的數組,可以實現像這樣:

data.ShoppingCartItems.sort(function (a, b) { 
    return new Date(a.Date) - new Date(b.Date); 
}); 

當你來到循環在陣列上存到一個參考最後一個日期,如果不同,只會將日期添加到輸出中。

This example將有助於更好地解釋它。

+0

感謝您的回覆,我會試一試,但在您使用forEach的小提琴(我認爲它在IE9以下沒有兼容性,並且由於各種原因我需要兼容性,但是我會嘗試使用您的代碼 –

+0

感謝Andy,你的解決方案(小提琴)我設法使用$ .each來達到兼容性的原因,並適應我的需求,我測試了一切似乎都很好的工作!非常感謝你的小提琴和你的時間。 –

0

看起來您的問題類似於發現的問題here

該溶液有如下:

首先,單獨的分組和 聚集。讓我們聲明原型的「group by」功能。另一個函數需要 爲數組元素產生「散列」字符串。

Array.prototype.groupBy = function(hash){ 
    var _hash = hash ? hash : function(o){return o;}; 
    var _map = {}; 
    var put = function(map, key, value) { 
    if (!map[_hash(key)]) { 
     map[_hash(key)] = {}; 
     map[_hash(key)].group = []; 
     map[_hash(key)].key = key; 
    } 

    map[_hash(key)].group.push(value);  
    } 

    this.map(function(obj){ 
    put(_map, obj, obj); 
    }); 

    return Object.keys(_map).map(function(key){ 
     return {key: _map[key].key, 
     group: _map[key].group 
     }; 
    }); 
}; 

在分組完成後,你可以彙總數據,你需要如何,你的情況

data.groupBy(function(o){ 
    return JSON.stringify({a: o.Phase, b: o.Step}); 
}) 
/* aggreagating */ 
.map(function(el){ 
    var sum = el.group.reduce(function(l,c) { 
    return l + parseInt(c.Value); 
    }, 0); 

    el.key.Value = sum; 
    return el.key; 
}); 

一般情況下,它的工作原理。我已經在Chrome控制檯中測試了該代碼,但隨時可以改進並發現錯誤;)。

我認爲這就是你要找的。

在這裏我有一個分組的實現,它會得到你一個日期數組。 http://jsfiddle.net/JV499/2/

var ItemsByDate = new Array(); 
$.each(ShoppingCart.ShoppingCartItems, function (i, Productos) { 
    var pushNewItem = true; 
    for (var index = 0; index < ItemsByDate.length; index++) 
    { 
     dateGroup = ItemsByDate[index]; 
     if (dateGroup.Date && dateGroup.Date == Productos.Date) { 
      dateGroup.Items.push(Productos); 
      pushNewItem = false; 
     } else { 

      pushNewItem = true; 
     } 
    } 
    if (pushNewItem) { 
     ItemsByDate.push({ 
       Date : Productos.Date, Items : [Productos] 
      }); 
    } 
}); 
+0

我認爲他正在使用underscore.js,出於某些原因我不能使用它。 –

+0

第三個答案有一個解決方案,不需要另一個Java腳本庫來運行。但是,它可能需要一些特定的應用程序。有可能有一個更簡單的解決方案,可以解決您的特定情況。 – Derek

+0

謝謝我會盡力瞭解初學者的答案。 –