函数在传入另一个函数后修剪值

Function trims values after being passed in another function

我想让 renderData() 显示来自 max 的值。当我在 calculateData()console.log(max) 时,它显示来自三个 JSON 对象的所有三个最大值。但是,当我 return max in renderData() 它只显示第一个值。为什么会这样,我该怎么做才能让它显示所有三个值而不是只显示一个值?注意:data 是要传递的对象的 json 列表。谢谢!

function calculateData(data) {

    for (i in data) {

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

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

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

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

}

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

也许这就是您的意图?它将遍历整个数据对象,为每次迭代计算一个最大值,将它们收集在一个数组中,然后最后使用该数组调用 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);
};

我创建了第二个数组,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);
    };

感谢大家的帮助!

您的错误出现是因为循环内的 return 语句中止了整个函数,因此也中止了循环。但是整个函数可以 simplified/shortened 很多:

并且如评论中所述,不要在循环内定义函数(除非不可避免),在循环之前定义。我通过在我的代码中定义函数 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() returns 仅拥有对象的值,而 for..in 遍历对象的所有值,包括拥有的和继承的。