正如主题所述,什么是最好的制作方法,以便在传递情感/值数组时根据javascript中的数字映射显示最接近的值? (在此示例中,Angry = 1,Happy = 2,Sad = 3)。
假设“高兴”与“快乐”是同一件事,而“沮丧”与“悲伤”是同一件事。我有以下代码,但它似乎冗长得令人难以置信,并且由于更多状态而变得Angry肿(即生气)。必须有一种更好的方法来做到这一点,该方法具有更高的可扩展性并减少代码发胖吗?除了情绪数组外,任何新功能,数据结构和变量都可以更改/引入。
let emotions = ['Happy','Happy','Sad','Glad','Angry']; // list of emotions, cannot change. everything else below it can.. ultimately want to return a string that reflects what the 'closest' emotion is.
// assuming Angry = 1, Happy = 2, Sad = 3
var numb = 0;
for(var i = 0; i < emotions.length; i++) {
if(numb == 'Angry')
numb+=1;
if(numb == 'Happy' || numb == 'Glad')
numb+=2;
if(numb == 'Sad' || numb == 'Down')
numb+=3;
}
var average = numb / emotions.length;
// check which one numb is closer to
if(average < 1.5)
return 'Angry';
if(average >= 1.5 && < 2.5)
return 'Happy';
if(average > 2.5)
return 'Sad';
if(average == 1.5)
return 'Angry or Happy';
if(average == 2.5)
return 'Happy or Sad';
基于此情绪列表的预期结果是2(快乐)+ 2(快乐)+ 3(悲伤)+ 2(快乐)+ 1(愤怒)= 10,然后除以5(情绪数组中的项目总数)为等于2。因此结果为“快乐”。
假设我添加了第四种类型的情感/感觉...如果出现这些情况,我会添加越来越多的内容,并且在逻辑上检查数字范围会变得更加复杂。
我正在查看整个情绪列表,并试图提出代表整个情绪列表的总体情绪。
做到这一点的最佳方法是什么,以使代码看起来干净并且我可以支持更多状态而无需使代码行变得太长?
最佳答案
像这样的事情呢:
具有两个对象常量:emotionsValues
:在这里,您为想要的每种情感赋予价值,就像为每种情感赋予分数。emotionsRank
:这是每个值的最终结果,基于平均值,您将从此处获得结果。
现在:
通过参数接收情绪数组。reduce
基于每个映射的情感的值(使用emotionsValues
)。
获得平均值
看看底值+ ceil值除以2是否等于数字本身(表示其正好是一半),因此请使用“情感或情感”。
或者,如果不是一半,则四舍五入到最接近的位置并获得正确的情感。不要忘记检查平均值是否小于1或大于上一个排名(在这种情况下为3)
const emotionsValues = {
"Angry": 1,
"Happy": 2,
"Glad": 2,
"Sad": 3,
"Down": 3,
}
const emotionsRank = {
1: "Angry",
2: "Happy",
3: "Sad",
}
function getEmotion(arrayEmot) {
let numb = arrayEmot.reduce((acc, v) => Number(emotionsValues[v]) + acc, 0);
let avg = numb / arrayEmot.length;
let min = Math.floor(avg)
let max = Math.ceil(avg)
if ((min + max) / 2 == avg && min != max) {
return emotionsRank[min] + " or " + emotionsRank[max]
} else {
let rounded = avg < 1 ? 1 : avg > 3 ? 3 : Math.round(avg);
return emotionsRank[rounded];
}
}
let emotionsTest = ['Happy', 'Happy', 'Sad', 'Glad', 'Angry'];
console.log(getEmotion(emotionsTest))
let emotionsTest2 = ['Happy', 'Happy', 'Sad', 'Sad'];
console.log(getEmotion(emotionsTest2))
关于javascript - 显示基于Java中数字的“最接近”值的最佳方法是什么? (例如1 =生气,2 =快乐,如果为1.6,则返回快乐),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59093317/