首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据字符串数组中的对应值返回字符串

如何根据字符串数组中的对应值返回字符串
EN

Stack Overflow用户
提问于 2019-11-28 16:45:35
回答 4查看 159关注 0票数 2

正如本主题所述,在传递一系列情感/值时,根据javascript中的数字映射显示最接近的值的最佳方法是什么?

假设“高兴”和“快乐”是一样的,而“沮丧”和“悲伤”是一样的。我尝试过的代码看起来非常长,如果我添加更多的情绪/状态(即愤怒),代码就会膨胀。除了情感数组之外,任何新的函数、数据结构和变量都可以更改/引入。

例如,我可以得到一份情绪清单:

代码语言:javascript
复制
let emotions = ['Happy','Happy','Sad','Glad','Angry']; 

现在我想返回一个字符串,它反映了基于这5种情绪的“最接近”的情绪。

更好的例子是,让我们假设与每一种情绪相对应的值是:

愤怒= 1,快乐= 2,悲伤=3

我试过这样的方法:

代码语言:javascript
复制
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".。

假设我增加了第四种情感.我会增加越来越多的这些条件,在逻辑上检查数字的范围变得更加复杂。

我把情绪作为一个整体来看,并试图想出一个代表整个列表的整体情感。

这样代码看起来干净,并且我可以支持更多的状态,而不让代码行变得太长的最佳方法是什么呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-11-28 16:56:59

像这样的东西呢?

有两个对象常量:

emotionsValues:在这里,你对你想要的每一种情绪都有一个价值,就像给每个人一个分数一样。

emotionsRank:这是每个值的最终结果,根据平均值,您将从这里得到结果。

现在:

parameter.

  • reduce接收情绪数组它基于每个映射情感的值(使用emotionsValues).

  • Get,平均

  • 查看地板值+ ceil值除以2是否等于数字本身(它表示它的一半),所以使用“情感或情感”。

  • OR,如果不是一半,则转到最近的地方,得到正确的情绪。不要忘记检查平均值是否低于1或更高(在本例中为3)

代码语言:javascript
复制
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))

票数 3
EN

Stack Overflow用户

发布于 2019-11-28 17:08:57

  • ,您可以创建价值函数emo及其倒数函数: value to emotions:
  • ,然后将数组中的每一种情绪映射到它的值
  • ,完成标准的数学内容
  • ,然后通过倒数函数

返回情感。

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2019-11-28 17:10:14

您可以创建一组索引,并通过对索引进行筛选来获取值。

代码语言:javascript
复制
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));

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59093317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档