正如本主题所述,在传递一系列情感/值时,根据javascript中的数字映射显示最接近的值的最佳方法是什么?
假设“高兴”和“快乐”是一样的,而“沮丧”和“悲伤”是一样的。我尝试过的代码看起来非常长,如果我添加更多的情绪/状态(即愤怒),代码就会膨胀。除了情感数组之外,任何新的函数、数据结构和变量都可以更改/引入。
例如,我可以得到一份情绪清单:
let emotions = ['Happy','Happy','Sad','Glad','Angry']; 现在我想返回一个字符串,它反映了基于这5种情绪的“最接近”的情绪。
更好的例子是,让我们假设与每一种情绪相对应的值是:
愤怒= 1,快乐= 2,悲伤=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 number 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(*Happy*) + 2(*Happy*) + 3(*Sad*) + 2(*Happy|Glad*) + 1(*Angry*) = 10
然后除以5(情绪排列长度),得到2。
因此,应该以字符串形式返回的结果是"Happy".。
假设我增加了第四种情感.我会增加越来越多的这些条件,在逻辑上检查数字的范围变得更加复杂。
我把情绪作为一个整体来看,并试图想出一个代表整个列表的整体情感。
这样代码看起来干净,并且我可以支持更多的状态,而不让代码行变得太长的最佳方法是什么呢?
发布于 2019-11-28 16:56:59
像这样的东西呢?
有两个对象常量:
emotionsValues:在这里,你对你想要的每一种情绪都有一个价值,就像给每个人一个分数一样。
emotionsRank:这是每个值的最终结果,根据平均值,您将从这里得到结果。
现在:
parameter.
reduce接收情绪数组它基于每个映射情感的值(使用emotionsValues).
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))
发布于 2019-11-28 17:08:57
返回情感。
const emoToValue = {
Glad: 1,
Happy: 1,
Sad: 2
}
const valueToEmos = Object.entries(emoToValue).reduce((acc, [emo, val]) => {
acc[val] = acc[val] || []
acc[val].push(emo)
return acc
}, {})
//compute the average:
function avgEmotion (emotions) {
if (emotions.length == 0) return ''
const avg = emotions.reduce((s, em) => s + emoToValue[em], 0) / emotions.length
return valueToEmos[Math.round(avg)].join(' or ')
}
console.log('str', avgEmotion(['Happy', 'Happy', 'Sad', 'Happy'])) //Glad or Happy
console.log('str', avgEmotion(['Happy', 'Happy', 'Sad', 'Sad'])) //Sad
发布于 2019-11-28 17:10:14
您可以创建一组索引,并通过对索引进行筛选来获取值。
function getEmotion(emotions, value) {
var values = new Set([value + 0.5, value - 0.5, Math.round(value)]);
return emotions.filter((e, i) => values.has(i + 1)).join(' and ');
}
console.log(getEmotion(['Happy', 'Sad', 'Glad', "Angry"], 1));
console.log(getEmotion(['Happy', 'Sad', 'Glad', "Angry"], 1.5));
console.log(getEmotion(['Happy', 'Sad', 'Glad', "Angry"], 1.7));
https://stackoverflow.com/questions/59093317
复制相似问题