Javascript 如何基于字符串数组中求和的对应值返回字符串
正如本主题所述,最好的方法是什么,以便在传递情绪/值数组时,根据javascript?中的数字映射显示最接近的值 假设“高兴”和“高兴”是同一回事,“沮丧”和“悲伤”是同一回事。我尝试过的代码似乎非常冗长,如果我添加更多的情绪/状态(例如愤怒),代码就会变得臃肿。除了情绪数组,任何新的函数、数据结构和变量都可以更改/引入 例如,我可以得到一个情绪列表:Javascript 如何基于字符串数组中求和的对应值返回字符串,javascript,arrays,Javascript,Arrays,正如本主题所述,最好的方法是什么,以便在传递情绪/值数组时,根据javascript?中的数字映射显示最接近的值 假设“高兴”和“高兴”是同一回事,“沮丧”和“悲伤”是同一回事。我尝试过的代码似乎非常冗长,如果我添加更多的情绪/状态(例如愤怒),代码就会变得臃肿。除了情绪数组,任何新的函数、数据结构和变量都可以更改/引入 例如,我可以得到一个情绪列表: let emotions = ['Happy','Happy','Sad','Glad','Angry']; 现在我想返回一个字符串,它反映
let emotions = ['Happy','Happy','Sad','Glad','Angry'];
现在我想返回一个字符串,它反映了基于这5种情绪的“最近的”情绪
举个更好的例子,让我们假设与每种情绪对应的值为:
愤怒=1,快乐=2,悲伤=3
我试着说:
var numb=0;
for(var i=0;i=1.5&&<2.5)
返回“快乐”;
如果(平均值>2.5)
返回“悲伤”;
如果(平均值==1.5)
返回“生气或高兴”;
如果(平均值==2.5)
返回“快乐或悲伤”;
基于此情感列表,我的预期结果是:2(*快乐*)+2(*快乐*)+3(*悲伤*)+2(*快乐*)+1(*愤怒*)=10
然后除以5(情感数组长度),得到2。
因此,应该作为字符串返回的结果是
“Happy”
比如说,我添加了第四种情绪/感觉。。。我会添加越来越多的条件,在逻辑上检查数字的范围会变得越来越复杂
我把所有的情绪都作为一个整体来看待,并试图找出一个代表所有情绪的整体
这样做的最佳方法是什么,这样代码看起来干净,并且我可以支持更多的状态,而不会让代码行变得太长?类似这样的事情怎么样: 有两个对象常量:
emotionsValues
:在这里,你可以为你想要的每种情绪分配一个值,就像给每种情绪分配一个分数一样。
emotionsRank
:这里是每个值的最终结果,基于平均值,您将从这里得到结果
现在:
根据每个映射情感的值减少它(使用情感值
)
const情绪值={
"愤怒":一,,
"快乐":二,,
“高兴”:2,
"悲哀":三,,
"倒":三,,
}
常量情感库={
1:“愤怒”,
2:“快乐”,
3:“悲伤”,
}
函数getEmotion(arrayEmot){
让numb=arrayEmot.reduce((acc,v)=>Number(情绪值[v])+acc,0);
设平均值=numb/arrayEmot.length;
最小值=数学楼层(平均值)
设max=Math.ceil(平均值)
如果((最小值+最大值)/2==平均值和最小值!=最大值){
返回emotionsRank[min]+“或”+emotionsRank[max]
}否则{
设四舍五入=平均值<1?1:平均值>3?3:数学四舍五入(平均值);
返回情绪库[四舍五入];
}
}
let emotionsTest=[“快乐”、“快乐”、“悲伤”、“高兴”、“愤怒”];
console.log(getEmotion(emotionsTest))
让情绪2=[‘快乐’、‘快乐’、‘悲伤’、‘悲伤’];
console.log(getEmotion(emotionsTest2))
- 您可以创建函数emo to value及其对应函数:value to emotionS:
- 然后将数组中的每个情感映射到它的值
- 做你标准的数学作业
- 并通过相互作用回归情感
const emoToValue={
高兴:1,,
快乐:1,,
悲伤:2
}
const valueToEmos=Object.entries(emoToValue).reduce((acc[emo,val])=>{
acc[val]=acc[val]| |【】
acc[val]。推送(emo)
返回acc
}, {})
//计算平均值:
功能运动(情绪){
if(emotions.length==0)返回“”
const avg=emotions.reduce((s,em)=>s+emoToValue[em],0)/emotions.length
返回值toemos[Math.round(avg)].join('or')
}
console.log('str',avgEmotion(['Happy','Happy','Sad','Happy'])//高兴还是高兴
console.log('str',avgEmotion(['Happy','Happy','Sad','Sad'])//Sad
您可以创建一组索引,并通过使用索引进行过滤来获取值
函数getEmotion(情感、价值){
var值=新集合([值+0.5,值-0.5,数学四舍五入(值)]);
返回emotations.filter((e,i)=>values.has(i+1)).join('and');
}
log(getEmotion(['Happy'、'Sad'、'Happy'、'nargy'、'nargy'],1));
log(getEmotion(['Happy'、'Sad'、'Happy'、'angle'、'Angry'],1.5));
log(getEmotion(['Happy'、'Sad'、'Happy'、'angle'、'Angry'],1.7))代码>此函数显式检查“中间”情况以及超出范围的值(因为它基于索引):
Math.round()?
@CalvinNunes这可能是其中的一部分,但在我的例子中,我希望1.5表示“高兴或悲伤”(中间地带),而不仅仅是默认的四舍五入。我认为这个问题可能有一个更好的答案-你可以查看他们的主题规则你想使用数组索引来获取字符串吗?你可以去掉小数(如果不是整数的话),然后得到emotations[x]+'或'+emotations[x+1]
我想这里有些混乱。用户传递的是情绪数组(字符串)还是浮点值数组?这是所有情绪的平均值吗?就好像有一个人
function getEmotion(emotions, value) {
// Out of range
if ( value > emotions.length ) return emotions[emotions.length - 1];
if ( value < 1 ) return emotions[0];
// Determine if decimal is .5
let mid = value % 1 === .5;
// Round the value to the nearest integer
let rounded = Math.round(value);
return mid ? `${emotions[rounded - 2]} or ${emotions[rounded - 1]}` : emotions[rounded - 1];
}
let emotions = ['Happy', 'Happy', 'Sad', 'Glad', 'Angry'];
console.log(getEmotion(emotions, -23)); // Happy
console.log(getEmotion(emotions, 0)); // Happy
console.log(getEmotion(emotions, 1)); // Happy
console.log(getEmotion(emotions, 2.43)); // Happy
console.log(getEmotion(emotions, 2.5)); // Happy or Sad
console.log(getEmotion(emotions, 3.1)); // Sad
console.log(getEmotion(emotions, 155.65)); // Angry