Skip to content

Instantly share code, notes, and snippets.

@pedrohugorm
Last active January 5, 2016 16:41
Show Gist options
  • Save pedrohugorm/584d0b323c75a7cfdd95 to your computer and use it in GitHub Desktop.
Save pedrohugorm/584d0b323c75a7cfdd95 to your computer and use it in GitHub Desktop.
Hierarchy SUM function DRAFT
###
Coffeescript test to sum a total value in an object hierarchy
###
class PropostaFormViewRule
constructor: (_) ->
@_ = _
sum: (obj, key) ->
# Remove nulls to avoid NaN/undefined sum
obj = @_.filter obj, (r) -> r
if !@_.isArray key
return @_.sum obj, key or 0
result = @_.extend {}, obj
for prop, i in key
copiedKey = @_.rest key
if @_.isArray result[0]
for item in result
mappingResult = @_.map result, (v) =>
@sum v, copiedKey
return @sum mappingResult
else
result = @_.pluck result, prop
return @sum result
vr = new PropostaFormViewRule(_)
data1 = [
{
"Nome": "Ifa 1",
"ProdutoresNacionais": [],
"ProdutoresInternacionais": [],
"ProdutoIntermediarioList": [
{
"Nome": "Produto Intermediário 1",
"Estimativa": {
"Atual": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"Ano": {
"1": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"2": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"3": {
"Total": null
},
"4": {
"Total": null
},
"5": {
"Total": null
}
}
}
},
{
"Nome": "Produto Intermediário 2",
"Estimativa": {
"Atual": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"Ano": {
"1": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"2": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"3": {
"Total": null
},
"4": {
"Total": null
},
"5": {
"Total": null
}
}
}
}
],
"Estimativa": {
"Atual": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"Ano": {
"1": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"2": {
"Total": 1,
"Unidade": 1,
"Valor": 1
},
"3": {
"Total": null
},
"4": {
"Total": null
},
"5": {
"Total": null
}
}
}
},
{
"Nome": "Ifa 2",
"ProdutoresNacionais": [],
"ProdutoresInternacionais": [],
"ProdutoIntermediarioList": [
{
"Nome": "Produto Intermediário 3",
"Estimativa": {
"Atual": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"Ano": {
"1": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"2": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"3": {
"Total": null
},
"4": {
"Total": null
},
"5": {
"Total": null
}
}
}
}
],
"Estimativa": {
"Atual": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"Ano": {
"1": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"2": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"3": {
"Total": null
},
"4": {
"Total": null
},
"5": {
"Total": null
}
}
}
}
]
data2 = [{
"Nome": "Produto Intermediário 1",
"Estimativa": {
"Atual": {
"Total": 2,
"Valor": 1,
"Unidade": 1
},
"Ano": {
"1": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"2": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"3": {
"Total": null
},
"4": {
"Total": null
},
"5": {
"Total": null
}
}
}
}, {
"Nome": "Produto Intermediário 1",
"Estimativa": {
"Atual": {
"Total": 98,
"Valor": 1,
"Unidade": 1
},
"Ano": {
"1": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"2": {
"Total": 1,
"Valor": 1,
"Unidade": 1
},
"3": {
"Total": null
},
"4": {
"Total": null
},
"5": {
"Total": null
}
}
}
}]
data3 = [
{
"Nome": "Ifa 1",
"ProdutoresNacionais": [],
"ProdutoresInternacionais": [],
"ProdutoIntermediarioList": [
{
"Test": [
{
"Estimativa": {
"Atual": {
"Total": 50,
"Valor": 1,
"Unidade": 1
}
}
},
{
"Estimativa": {
"Atual": {
"Total": 50,
"Valor": 1,
"Unidade": 1
}
}
}
{
#NULL ON PURPOSE
}
]
}
]
}
]
depth1 = ["ProdutoIntermediarioList","Estimativa", "Atual", "Total"]
depth2 = ["Estimativa", "Atual", "Total"]
depth3 = ["ProdutoIntermediarioList","Estimativa", "Ano", "1", "Total"]
depth4 = ["ProdutoIntermediarioList","Test","Estimativa", "Atual", "Total"]
test1 = vr.sum(data1, depth1)
test2 = vr.sum(data1, depth2)
test3 = vr.sum(data2, depth2)
test4 = vr.sum(data3, depth4)
console.log test1, test1 == 3
console.log test2, test2 == 2
console.log test3, test3 == 100
console.log test4
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.0-beta.1/angular.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
<script src="http://yourjavascript.com/6140145215/underscore-math.js"></script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment