2013-02-23 59 views
0

我一直試圖小時做到這一點使用json.js但只是太多的東西,似乎很簡單。我有這樣的例子數據:聯接和Javascript中數組聚集

var hotels = [ 
     { id: 101, Name: "Hotel 101", WebFacilities: [8, 9, 10] }, 
     { id: 102, Name: "Hotel 101", WebFacilities: [8] }, 
     { id: 103, Name: "Hotel 101", WebFacilities: [8, 10] } 
    ]; 

    var facilities = [ 
     { id: 8, Name: "Facility 8" }, 
     { id: 9, Name: "Facility 9" }, 
     { id: 10, Name: "Facility 10" } 
    ]; 

我想要得到這樣的:

var selectedFacilities = [ 
     { id: 8, Name: "Facility 8", Count: 3 }, 
     { id: 9, Name: "Facility 9", Count: 1 }, 
     { id: 10, Name: "Facility 10", Count: 2 } 
    ]; 

我該怎麼辦呢?

回答

2

所以看起來你想指望有多少各設施的。

下面是使用C#編寫查詢的一種方法:

var hotelFacilities = 
    from hotel in hotels 
    from id in hotel.WebFacilities 
    group id by id; 

var query = 
    from facility in facilities 
    join g in hotelFacilities on facility.id equals g.Key 
    select new 
    { 
     id = facility.id, 
     Name = facility.Name, 
     Count = g.Count(), 
    }; 

現在,如果你能想象這種使用方法的語法,這幾乎是1:1轉換到linq.js版本。

注意編譯器翻譯上面的方式通常會包括前面SelectMany()調用中的GroupBy()調用。然而這樣寫會讓編寫linq.js等效的查詢更容易,更尷尬。

var hotelFacilities = hotels 
    .SelectMany(hotel => hotel.WebFacilities) 
    .GroupBy(id => id); 

var query = facilities 
    .Join(
     hotelFacilities, 
     facility => facility.id, 
     g => g.Key, 
     (facility, g) => new 
     { 
      id = facility.id, 
      Name = facility.Name, 
      Count = g.Count(), 
     } 
    ); 

和等價的linq.js查詢。

var hotelFacilities = Enumerable.From(hotels) 
    .SelectMany("hotel => hotel.WebFacilities") 
    .GroupBy("id => id") 
    .ToArray(); 

var query = Enumerable.From(facilities) 
    .Join(
     hotelFacilities, 
     "facility => facility.id", 
     "g => g.Key()", 
     "(facility, g) => { id: facility.id, Name: facility.Name, Count: g.Count() }" 
    ).ToArray(); 
+0

優秀的答案我已經更新的ID。謝謝! – 2013-03-10 14:52:30

0

使用此:

var selectedFacilities = facilities; 

for(var i = 0; i < facilities.length; i++) { 
    for(var j = 0; j < hotels.length; j++) { 
     if(hotels[j]["id"] == facilities[i]["id"]) { 
      // Add data 
      selectedFacilities[i]["Count"] = hotels[i]["WebFacilities"].length; 
     } else { 
      selectedFacilities[i]["Count"] = 0; 
     } 
    } 

} 
+0

這看起來不正確。我認爲這是我的錯誤,因爲沒有說清楚。這個想法是獲得每個設施的酒店數量。所以它更清晰 – 2013-02-23 18:31:34