如何将代码转换为优雅的Lodash

时间:2017-01-19 22:28:35

标签: lodash

我在对象数组上执行一系列操作(最初使用下划线),这些对象找到销售额最高的月份的销售值。

数据:values数组表示给定月份的总销售额。 x =日期,y =销售。

[
    {
        name:'banana',
        values:[
            {
                x: //date object: jan 2016,
                y: 3423
            },
            {
                x: //date object: feb 2016,
                y: 53453
            },
            {
                x: //date object: mar 2016,
                y: 65457
            },
            {
                x: //date object: apr 2016,
                y: 456345
            },
            ...//12 months
        ]
    },
    {
        name:'apple',
        values:[
            {
                x: //date object: jan 2016,
                y: 34876
            },
            {
                x: //date object: feb 2016,
                y: 89
            },
            {
                x: //date object: mar 2016,
                y: 7896
            },
            {
                x: //date object: apr 2016,
                y: 6547
            },
            ...//12 months
        ]
    },
    ... more objects
]

我的功能:返回所有月份中的最高销售额。

getMaxMonthlySales:function(data){
    var salesArrays = _.map(data,obj=>_.map(obj.values,'y'))

    var maxSales = _.zip.apply(null,salesArrays)
    maxSales = _.reduce(maxSales,(max,arr)=>{
        var sum = _.reduce(arr,(memo,val)=>memo+val);
        return Math.max(max,sum);
    },0)

    return maxSales;
}

每个对象的所有values数组都保证长度相同并且具有相同的日期顺序。我的一般策略是执行嵌套映射以获取仅销售的数组数组。然后将数组压缩到按月分组销售。然后最后减少每个月找到每月的总销售额,然后找到最大月份。

我的问题是我如何才能将此功能重写为理想的lodash链?

1 个答案:

答案 0 :(得分:1)

作为oneliner:

<?php 
$q=mysqli_query($conn,"select * from notice where user='".$_SESSION['user']."'");
$rr=mysqli_num_rows($q);
if(!$rr)
{
    echo "<h2 style='color:red'>No any notice for You !!!</h2>";
}
else
{
    echo "<h2 style='color:green'>Total Notice for you: $rr</h2>";      
}
?>

或者

getMaxMonthlySales: function(data) {
     return _.max(_.map(_.groupBy(_.flatten(_.map(data, 'values')), 'x'),
                  o => _.sumBy(o, 'y')));
}