2009-06-26 4 views
4
IList<Customer> Customers = 
      flat.GroupBy(cust => new { cust.ReferenceNumber, cust.Name, cust.Address }) 
       .Select(c => new Customer() 
       { 
        ReferenceNumber = c.Key.ReferenceNumber, 
        Name = c.Key.Name, 
        Address = c.Key.Address, 
        Orders = c.Select(o => new Order() 
        { 
         OrderId = o.OrderId, 
         ProductName = o.ProductName, 
         Description = o.Description, 
         Amount = o.Amount 
        }).ToList() 
       }).ToList() 

Принимает ли плоский список и преобразовывает его в вложенный объект, возможно, в Javascript? Общее решение, которое есть?Создание вложенных объектов в javascript, например groupby in C#

+0

Легенда! Просто решить мой вопрос о группировке с использованием underscore.js [10022156] [1] [1]: http://stackoverflow.com/questions/10022156/underscore-js-groupby-multiple-values ​​ – rickysullivan

ответ

3

Да.

Вы можете передавать функции в JavaScript, которые будут служить той же цели, что и лямбда-выражения в коде C#. Возьмите использование JQuery в «каждый» в качестве примера:

$('div.several').each(function() { 
    // Do something with the current div. 
}); 

Вы также можете создавать вложенные объекты довольно легко:

var outer = { 
    inner1: { 
     val1: 'a', 
     val2: 'b' 
    }, 
    inner2: { 
     val1: 'c', 
     val2: 'd' 
    } 
}; 

Конечно, вы можете сделать это динамически, а не все сразу:

var outer = {}; 
outer.inner1 = {}; 
outer.inner1.val1 = 'a'; 
... 

Затем, чтобы сделать то, что вы ищете, вы должны будете использовать массивы:

var result = []; 
for (var i=0; i<x; ++i) { 
    result[result.length] = GetIndividualResult(i); 
} 
+0

Не совсем что мне нужно, но некоторые строительные блоки к решению. Приветствия. – Schotime

16

Несмотря на то, что это старый вопрос, я думал, что предложить более элегантное решение:

/** 
* Groups an array of objects by one or more keys 
* 
* @param array arr  The array of objects to group 
* 
* @param string|function A string representing the child property to group by 
*      or a function that returns an array of one or more properties. 
* 
* @returns    An object with keys representing the grouping properties, 
*      finally holding an array of records that fell into 
*      those groups. 
*/ 
var group = function(items, by) { 
    var groups = {}, 
     group, 
     values, 
     i = items.length, 
     j, 
     key, 
     group_keys; 

    // make sure we specified how we want it grouped 
    if(!by) { return items; } 
    while(i--) { 

     // find out group values for this item 
     values = (typeof(by) === "function" && by(items[i]) || 
        typeof items[i] === "object" && items[i][by] || 
        items[i]); 

     // make sure our group values are an array 
     values = values instanceof Array && values || [ values ]; 

     // recursively group 
     group = groups; 
     for(j = 0; j < values.length; j++) { 
      key = values[j]; 
      group = (group [key] || (group [key] = j === values.length - 1 && [] || {})); 
     } 

     // for the last group, push the actual item onto the array 
     group = (group instanceof Array && group || []).push(items[i]); 
    } 

    return groups; 
}; 

Calling его с этим:

var items = [ 
    { "id" : 1, "name" : "foo", "category" : "a" }, 
    { "id" : 2, "name" : "foo", "category" : "a" }, 
    { "id" : 3, "name" : "bar", "category" : "b" }, 
    { "id" : 4, "name" : "free", "category" : "a" }, 
    { "id" : 5, "name" : "beer", "category" : "b" }, 
    { "id" : 6, "name" : "foo", "category" : "b" } 
]; 

var groups = group(items, function(item) { return [ item.category, item.name ]; }); 

Урожайность это:

{ 
    b: { 
     foo: [ 
      { 
       id: 6 
       name: foo 
       category: b 
      } 
     ] 
     beer: [ 
      { 
       id: 5 
       name: beer 
       category: b 
      } 
     ] 
     bar: [ 
      { 
       id: 3 
       name: bar 
       category: b 
      } 
     ] 
    } 
    a: { 
     free: [ 
      { 
       id: 4 
       name: free 
       category: a 
      } 
     ] 
     foo: [ 
      { 
       id: 2 
       name: foo 
       category: a 
      } 
      { 
       id: 1 
       name: foo 
       category: a 
      } 
     ] 
    } 
} 

В любом случае, надеюсь, что это кому-то поможет.

+3

+1 для скрипта! Я пытался реализовать его сам по себе, не повезло: P ... это слишком загадочно, на мой взгляд, но это работает, так или иначе я заменил «предметы» на «arr», чтобы он работал правильно. Спасибо;) – daveoncode

+0

Добро пожаловать! Да, критический характер этой функции допускает вложенную группировку (например, группу по категориям, а затем по имени). Рекурсия - наш друг и делает это легко. –

+1

Отлично! И легко сделанный как плагин jquery, спасибо! Я сделал исправление arr/items к вашему ответу, теперь все должно быть хорошо. – Jerther

 Смежные вопросы

  • Нет связанных вопросов^_^