簡體   English   中英

使用lodash轉換集合

[英]Transforming collection using lodash

我有一個查詢給我Json數據; 例如,我有以下Json

{
"salesInvoices":

    [
    {
        "id": "1",
        "salesInvoiceLines":
        [
            {
                "ItemCode": "Apple",
                "UnitCode": "piece",
                "Quantity": "10"
            },
            {
                "ItemCode": "Orange",
                "UnitCode": "box",
                "Quantity": "2"
            }
        ]
    },
    {
        "id": "2",
        "salesInvoiceLines":
        [
            {
                "ItemCode": "Apple",
                "UnitCode": "piece",
                "Quantity": "20"
            },
            {
                "ItemCode": "Orange",
                "UnitCode": "piece",
                "Quantity": "21"
            },
            {
                "ItemCode": "Orange",
                "UnitCode": "box",
                "Quantity": "1"
            }
        ]
    }
    ]

}

我想按項目 - 單元對將數據分組為以下格式:

[
  { item : 'Apple', unit : 'piece', totalQuantity : 30 },
  { item : 'Orange', unit : 'piece', totalQuantity : 21 },
  { item : 'Orange', unit : 'box', totalQuantity : 3 }
]

我使用lodash庫累了以下代碼,但它不起作用

   var sumQuantity = function(total, item){
        return total + item.Quantity
    }

    var transformList = function(line){
        return _.map(line.SalesInvoiceLines, function(invoice){
            return _.map(invoice, function(line){
                return {
                    item: line.ItemCode,
                    unit: line.UnitCode,
                    totalQuantity: _.reduce(line.Quantity, sumQuantity, 0)
                }
            })
        });
    };

    var groupedList = _.groupBy(data.d.results, function(line) {
        return line.ItemCode + line.UnitCode;
    });

    var list = _.chain(groupedList)
    .map(transformList)
    .flatten()
    .value();

我怎樣才能得到上述結果?

對不起,我不能給你一個具體的工作實例。 從我所看到的,您的代碼中存在以下概念錯誤:

  1. 我猜最初的groupBy語句是錯誤的。 假設data.d.results與您發布的示例JSON相同,那么您無法訪問line.ItemCode + line.UnitCode; 那里。 相反,您只需獲得salesInvoices一次迭代。

  2. 您有一個級別的_.map調用,您不需要:

    return _.map(line.SalesInvoiceLines, function(invoice){ return _.map(invoice, function(line){

=>發票已經是發票。 迭代發票的屬性是沒有意義的(將它們稱為line也沒有意義)。

  1. 在totalQuantity中使用_.reduce()是沒有totalQuantity: _.reduce(line.Quantity, sumQuantity, 0)因為line.Quantity已經是原始數字。 你不能“減少”那個。

我的建議是:

  1. 獲得正確的基本轉換,並嘗試將所有發票提取到平面數組中
  2. 然后你可以_.reduce()將這個數組轉換為一個中間對象,其中的鍵包含“line.ItemCode + line.UnitCode”,指向你想要的形式的對象,例如{ item : 'Apple', unit : 'piece', totalQuantity : 30 } 在每次reduce迭代中,您只需確定此“唯一鍵”,測試對象是否已存在,如果不是,則使用totalQuantity = 1創建它,否則只需增加totalQuantity。
  3. finnaly,在步驟2的中間結果上調用_.values()。
// Input
var data = {
    "salesInvoices": [{
        "id": "1",
        "salesInvoiceLines": [{
            "ItemCode": "Apple",
            "UnitCode": "piece",
            "Quantity": "10"
        }, {
            "ItemCode": "Orange",
            "UnitCode": "box",
            "Quantity": "2"
        }]
    }, {
        "id": "2",
        "salesInvoiceLines": [{
            "ItemCode": "Apple",
            "UnitCode": "piece",
            "Quantity": "20"
        }, {
            "ItemCode": "Orange",
            "UnitCode": "piece",
            "Quantity": "21"
        }, {
            "ItemCode": "Orange",
            "UnitCode": "box",
            "Quantity": "1"
        }]
    }]

}
//Output
/*
[
  { item : 'Apple', unit : 'piece', totalQuantity : 30 },
  { item : 'Orange', unit : 'piece', totalQuantity : 21 },
  { item : 'Orange', unit : 'box', totalQuantity : 3 }
]
*/
// Code
_.chain(_.flatten(_.map(data.salesInvoices, 'salesInvoiceLines')))
    .reduce(function(output, curr) {
        output[curr.ItemCode + '_' + curr.UnitCode] = output[curr.ItemCode + '_' + curr.UnitCode] ? output[curr.ItemCode + '_' + curr.UnitCode] + parseInt(curr.Quantity) : parseInt(curr.Quantity);
        return output;
    }, {})
    .reduce(function(result, value, key) {
        result.push({
            item: key.split('_')[0],
            unit: key.split('_')[1],
            totalQuantity: value
        });
        return result;
    }, []).value();

我能夠使用以下代碼完成它:

    var invoicelines = [];
    var lines = _.map(data, 'SalesInvoiceLines');

    var getLines = lines.forEach(function (entry){
        var l = entry.results;
        l.forEach(function (line){
            invoicelines.push(line);
        })
    });

    var list = _.chain(invoicelines)
       .groupBy(function(sll) {
            return sll.ItemCode + sll.UnitCode;
        })
        .map(function(value, key) {
            return [key, _.reduce(value, function(result, currentObject) {
                return {
                    Item: currentObject.ItemCode,
                    Unit: currentObject.UnitCode,
                    Quantity: result.Quantity + currentObject.Quantity
                }
            }, {
                Quantity: 0
            })];
        })
        .object()
        .sortBy(function(item) {
           return item.Quantity
        })
        .value();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM