[英]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();
我怎樣才能得到上述結果?
對不起,我不能給你一個具體的工作實例。 從我所看到的,您的代碼中存在以下概念錯誤:
我猜最初的groupBy語句是錯誤的。 假設data.d.results與您發布的示例JSON相同,那么您無法訪問line.ItemCode + line.UnitCode;
那里。 相反,您只需獲得salesInvoices
一次迭代。
您有一個級別的_.map
調用,您不需要:
return _.map(line.SalesInvoiceLines, function(invoice){ return _.map(invoice, function(line){
=>發票已經是發票。 迭代發票的屬性是沒有意義的(將它們稱為line
也沒有意義)。
totalQuantity: _.reduce(line.Quantity, sumQuantity, 0)
因為line.Quantity
已經是原始數字。 你不能“減少”那個。 我的建議是:
{ item : 'Apple', unit : 'piece', totalQuantity : 30 }
。 在每次reduce迭代中,您只需確定此“唯一鍵”,測試對象是否已存在,如果不是,則使用totalQuantity = 1創建它,否則只需增加totalQuantity。 // 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.