2015-01-28 3 views
0

У меня есть следующий массив:Linq.Js Group By с графом

var data= [{ "Id": 1, "Name": "NameOne"} 
      { "Id": 2, "Name": "NameTwo"} 
      { "Id": 2, "Name": "NameTwo"}] 
      { "Id": 3, "Name": "NameThree"}] 

Использование linq.js Я хотел бы вернуть следующий массив:

var data= [{ "Id": 1, "Name": "NameOne", Total: 1} 
      { "Id": 2, "Name": "NameTwo", Total: 2} 
      { "Id": 3, "Name": "NameThree", Total: 1}] 

Это означает, что мне нужно использовать GroupBy() с Count(). Я не уверен, как применить это, используя ссылку linq.js.

ответ

3

Это действительно просто:

var data = [ 
    { Id: 1, Name: 'NameOne' }, 
    { Id: 2, Name: 'NameTwo' }, 
    { Id: 2, Name: 'NameTwo' }, 
    { Id: 3, Name: 'NameThree' } 
]; 
var query = Enumerable.From(data) 
    // GroupBy (keySelector, elementSelector, resultSelector, compareSelector) 
    .GroupBy(
     null, // (identity) 
     null, // (identity) 
     "{ Id: $.Id, Name: $.Name, Total: $$.Count() }", 
     "'' + $.Id + '-' + $.Name" 
    ) 
    .ToArray(); 

Используйте перегрузку GroupBy(), которая включает в себя resultSelector, вы хотите, чтобы захватить количество сгруппированных элементов (второй параметр).

0

Возможно, у вас были проблемы с неравномерностью данных. сокращение сглаживает вашу структуру данных, а затем вы можете манипулировать им, как хотите, в .Select().

var intialData = [[{ "Id": 1, "Name": "NameOne"}, { "Id": 2, "Name": "NameTwo"}, { "Id": 2, "Name": "NameTwo"}], { "Id": 3, "Name": "NameThree"}];   

var data = Enumerable.From(intialData.reduce(function(a,b) { return a.concat(b); })) 
        .GroupBy(function(item) { return item.Id; }) 
        .Select(function(item) { return {"Id":item.source[0].Id, "Name":item.source[0].Name, "Total": item.source.length}; }) 
        .ToArray(); 
+0

Это еще один способ сделать это. Благодарю. – nav