2016-01-17 3 views
0

Я следующий запрос, чтобы выбрать пункт, единицы измерения и количество строк заказов на продажу:Группировка Json коллекция/XML с помощью lodash

var urlBestSoldItemDaily = sharedProperties.fooApi + 
    "/salesinvoice/SalesInvoices?$expand=SalesInvoiceLines&" + 
    "$select=SalesInvoiceLines/ItemCode,SalesInvoiceLines/UnitCode,SalesInvoiceLines/Quantity&" 

В результате получается нечто вроде этого:

<entry> 
<id>https://foo/api/salesinvoice/SalesInvoices(guid'607897fa-44aa-4626-a151-1b084bc9d149')</id> 
<m:inline> 
    <feed> 
     <title type="text">SalesInvoiceLines</title> 
     <id>https://foo/api/salesinvoice/SalesInvoices(guid'607897fa-44aa-4626-a151-1b084bc9d149')/SalesInvoiceLines</id> 
     <entry> 
     <id>https://foo/api/salesinvoice/SalesInvoiceLines(guid'2cdf60c3-3430-4d6c-a58a-b7e96f9d6be6')</id> 
     <content type="application/xml"> 
      <m:properties> 
      <d:ItemCode>IND43007</d:ItemCode> 
      <d:Quantity m:type="Edm.Double">2</d:Quantity> 
      <d:UnitCode>box</d:UnitCode> 
      </m:properties> 
     </content> 
     </entry> 
    </feed> 
    </m:inline> 

Я хочу выполнить группировку по элементу, а затем выбрать первую десятку списка результатов, отсортированную по количеству, используя lodash. Я попытался с помощью следующего группирования, но он не работает:

var list = _.groupBy(data.d.results, 'SalesInvoiceLines.ItemCode, SalesInvoiceLines.UnitCode'); 

Как я могу выполнить группировку, так что я бы коллекцию сгруппированных элемента и единицы с общим количеством?

+0

Ваш JSON выглядит подозрительно, как XML. – robertklep

ответ

1

Пример того, как вы могли бы сделать это:

var sales = [ 
    {itemCode: "0001", quantity: 2, unitItem: "box" }, 
    {itemCode: "0002", quantity: 2, unitItem: "box" }, 
    {itemCode: "0003", quantity: 3, unitItem: "boxx" }, 
    {itemCode: "0004", quantity: 3, unitItem: "boxxx"}, 
    {itemCode: "0005", quantity: 1, unitItem: "boxxx"} 
    ]; 

    /* 
    * I want to perform grouping on item-unit and then select the top 10 
    * of the result list sorted by quantity, using lodash. 
    */ 

    var calcQuantities = function(sales) { 

    var sum = function(total, curr) { 
     return total + curr.quantity; 
    }; 

    return _.reduce(sales, sum, 0); 
    }; 

    var toQuantitySale = function(sales) { 
    return { 
     quantity: calcQuantities(sales), 
     sales : sales 
    }; 
    }; 

    var sortDesc = function(sale) { 
    return -sale.quantity; 
    }; 

    // Steps 
    var groupedSales = _.groupBy(sales, 'unitItem') 

    var quantitySales = _.map(groupedSales, toQuantitySale) 

    var sortedSales = _.sortBy(quantitySales, sortDesc) 

    var top10Sales = _.take(sortedSales, 10) 

    console.log(top10Sales); 

    // shorter 
    top10Sales = 
    _.chain(sales) 
    .groupBy('unitItem') 
    .map(toQuantitySale) 
    .sortBy(sortDesc) 
    .take(10) 
    .value() 
+0

все еще, с этим методом также я не могу получить сгруппированный массив. что мне не хватает? Я хочу получить массив в результате сгруппированным кодом предмета и единицей, в которой количество является суммарным количеством сгруппированных. –

+0

Не уверен, что вы считаете нужным. Я думаю, вам нужно что-то вроде '{'SalesInvoiceLines.ItemCode, SalesInvoiceLines.UnitCode': 2}'. И я думаю, вы можете получить его, вычислив 'list', как указано выше, а затем вычислить' _.map (list, sum) ', если вы определите функцию' sum', которая берет один из массивов внутри 'list' и возвращает число путем суммирования чисел 'd: Quantity' внутри него. –

+0

@SiavoshTehrani, я отредактировал свой ответ, если он работает для вас сейчас, и именно так описывает Дэвид Книп. –

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