函数在另一个函数中传递后修剪值

时间:2017-05-17 19:55:34

标签: javascript json node.js watson

我希望 $foos = DB::table('foo') ->where('name', 'LIKE', '%' . $query . '%') ->orWhere('description', 'LIKE', '%' . $query . '%') ->orWhere('address_city', 'LIKE', '%' . $query . '%') ->orWhere('short_description', 'LIKE', '%' . $query . '%') ->orWhere('interview', 'LIKE', '%' . $query . '%') ->get(); $foos = $foos->where('active', true)->get(); 显示renderData()的值。当我在maxconsole.log(max)时,它会显示三个JSON对象中的所有三个最大值。但是,当我在calculateData()中返回max时,它只会显示第一个值。为什么这样,我该怎么做才能让它显示所有三个值而不是一个?注意:renderData()是传递的对象的json列表。谢谢!

data

3 个答案:

答案 0 :(得分:1)

也许这就是你想要的?它将遍历整个数据对象,计算每次迭代的最大值,将它们收集到一个数组中,最后用该数组调用renderData函数。

function calculateData(data) {
   var maxes = [];
    for (i in data) {

        var arr = [];
        var max;
        var obj = data[i].tones;

        obj.map(function(item) {
            var data = item.score;
            arr.push(data);
        })

        maxes.push(arr.reduce(function(a, b) {
            return Math.max(a, b);
        }));

    }
    return renderData(maxes);

}

function renderData(max) {
    console.log(max);
};

答案 1 :(得分:0)

我创建了第二个数组finalArray并将每个最大值推入其中:

 function calculateData(data) {

        var finalArr = [];

        for (i in data) {

            var arr = [];

            var max;

            data[i].tones.map(function(item) {
                arr.push(item.score);
            })

            var max = arr.reduce(function(a, b) {
                return Math.max(a, b);
            });

            finalArr.push(max);

            //Returns an array containing dominant [emotion_tone, language_tone, social_tone]
            // return renderData(max);
        }

        renderData(finalArr);

    }

    function renderData(finalArr) {
        console.log(finalArr);
    };

感谢您的帮助!

答案 2 :(得分:0)

出现错误是因为循环中的return语句会中止整个函数,因此也会中止循环。但是整个功能可以简化/缩短:

正如评论中所提到的,不要在循环中定义函数(除非它是不可避免的),在循环之前定义。我通过在代码中定义函数getScoremax来完成此操作。

//ES6
function calculateData(data) {
    var getScore = item => item.score, 
        max = (a,b) => Math.max(a,b),
        maxima = Object.values(data)
            .map(value => value.tones.map(getScore).reduce(max)); 

    return renderData(maxima);
}

//Or maybe you're more comfortable without Arrow functions
function calculateData(data) {
    function getScore(item){ return item.score }
    function max(a,b){ return Math.max(a,b) }

    var maxima = Object.values(data).map(function(value){ 
        return value.tones.map(getScore).reduce(max)
    }); 

    return renderData(maxima);
}

代码的唯一区别是Object.values()只返回对象的自己的值,而for..in遍历对象的所有值,拥有和继承。