函数在传入另一个函数后修剪值
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 很多:
并且如评论中所述,不要在循环内定义函数(除非不可避免),在循环之前定义。我通过在我的代码中定义函数 getScore
和 max
来做到这一点。
//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
遍历对象的所有值,包括拥有的和继承的。
我想让 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 很多:
并且如评论中所述,不要在循环内定义函数(除非不可避免),在循环之前定义。我通过在我的代码中定义函数 getScore
和 max
来做到这一点。
//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
遍历对象的所有值,包括拥有的和继承的。