2016-09-22 60 views
0

爲了確保兩個數組JavaScript中的一樣,這是我做的: (插入零那裏是在物品1數據缺失)如何在JavaScript中匹配C#中的兩個數組?

var viewModel = @Html.Raw(Json.Encode(Model)); 
    var items = viewModel.Date1; 
    var items2 = viewModel.Date2; 

    items = items2.map(row => 
     //is there a matching row in items? 
     items.filter(r => r.theString == row.theString).length == 0 ? 
     //if not, fill with zeros 
       {theString:0, theCount:0} : 
     //if there is, return the items' row 
     items.filter(r => r.theString == row.theString)[0]); 

我使用的條形圖以百分比的數據。我需要這樣的實際計數的數字顯示在表格形式的結果:

<div style="padding-top: 30px"> 
    <table id="table_id" class="display"> 
     <thead> 
      <tr> 
       <th>Month</th> 
       <th>Cancelled</th> 
       <th>Total</th> 
      </tr> 
     </thead> 
     <tbody> 
      @using (var e1 = Model.Date1.Reverse().GetEnumerator()) 
      { 
       using (var e2 = Model.Date2.Reverse().GetEnumerator()) 
       { 
        while (e1.MoveNext() && e2.MoveNext()) 
        { 
         var item1 = e1.Current; 
         var item2 = e2.Current; 
         <tr> 
          <td>@item1.theDate.Value.ToString("MMMM-yyyy") </td> 
          <td>@item1.theCount</td> 
          <td>@item2.theCount</td> 
         </tr> 
        } 
       } 
      } 
     </tbody> 
    </table> 
    </div> 

問題是,這些陣列還沒有固定的搭配海誓山盟,所以它的顯示數據是不正確。日期(theDate)與值不匹配。

或者我可以只使用javascript中的items和items2來製作表格嗎?

+1

我無限希望有元組/對象/的一個陣列無論比,都應該在匹配的東西兩個平行陣列相同的指數。出於這個原因,並且因爲它會大規模地清理剃鬚刀代碼中的循環,並且...您將其命名。 –

+0

我不知道Type(class)'item1'和'item2'是什麼,所以我不知道如何比較它們以知道它們是否相同。否則,使用Linq的Lambda方法(如Zip()),Where()和Select()可以創建一個單獨的列表,以循環使用當前不需要的所有舊式'GetEnumerator()'和'MoveNext()'方法.Net版本。 –

+0

你看過Linq的.Select方法嗎?它應該在功能上與.map相似。 https://msdn.microsoft.com/en-us/library/bb534869(v=vs.110).aspx –

回答

1

像這樣的東西應該工作:

@foreach (var item1 in Model.Date1.Reverse()) 
{ 
    var item2Count = Model.Date2.Where(i2 => i2.theDate == item1.theDate) 
     .Select(i2 => i2.theCount) 
     .FirstOrDefault(); 
    <tr> 
     <td>@item1.theDate.Value.ToString("MMMM-yyyy") </td> 
     <td>@item1.theCount</td> 
     <td>@item2Count</td> 
    </tr> 
} 

這與JavaScript的你貼了,所以如果你有一個非常大的數量的項目有一個機會,你會看到性能下降相同漸進複雜。這可以通過創建Date2值的查找解決,就像這樣:

@{ 
var item2CountsByDate = Model.Date2.ToLookup(i => i.theDate, i => i.theCount); 
foreach (var item1 in Model.Date1.Reverse()) 
{ 
    var item2Count = item2CountsByDate[item1.theDate] 
     .FirstOrDefault(); 
    <tr> 
     <td>@item1.theDate.Value.ToString("MMMM-yyyy") </td> 
     <td>@item1.theCount</td> 
     <td>@item2Count</td> 
    </tr> 
} 
} 
相關問題