javascript - 如何根据字符串数组求和的对应值返回字符串

标签 javascript arrays

正如主题所述,当您传递情感/值数组时,最好的方法是什么,以便根据 JavaScript 中的数字映射显示最接近的值?

假设“Glad”与“Happy”相同,“Down”与“Sad”相同。我尝试过的代码看起来非常冗长,如果我添加更多的情绪/状态(即愤怒),代码就会变得臃肿。除了情感数组之外,任何新函数、数据结构和变量都可以更改/引入。

例如,我可以获得情绪列表:

let emotions = ['Happy','Happy','Sad','Glad','Angry']; 

现在我想返回一个字符串,反射(reflect)基于这 5 种情绪的“最接近”情绪。

作为一个更好的例子,我们假设每种情绪对应的值是:

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 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(*快乐*) + 2(*快乐*) + 3(*悲伤*) + 2(*快乐|高兴*) + 1(*愤怒*) = 10
然后除以 5(情绪数组长度),得到 2。
因此,应该以字符串形式返回的结果是 "Happy"

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

我正在查看整个情绪列表,并尝试提出代表整个列表的整体情绪。

执行此操作的最佳方法是什么,以便代码看起来干净并且我可以支持更多状态而不会使代码行变得太长?

最佳答案

像这样的事情怎么样:

有两个对象常量:
emotionsValues:在这里,您可以为您想要的每种情绪分配一个值,就像每个情绪的分数一样。
emotionsRank:这是每个值的最终结果,基于平均值,您将从这里得到结果。

现在:

  1. 通过参数接收情绪数组。

  2. 根据每个映射情绪的值减少(使用emotionsValues)。

  3. 获取平均值

  4. 看看下限值+上限值除以2是否等于数字本身(这意味着它恰好是一半),所以使用“情绪或情绪”。

  5. 或者,如果不是一半,则四舍五入到最接近的值并获得正确的情绪。不要忘记检查平均值是否低于 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 - 如何根据字符串数组求和的对应值返回字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59093317/

相关文章:

c++ - 字符串到唯一指针数组

c - 一次增加两个索引

javascript - 用于在 gmail 中插入数学的 Greasemonkey 脚本

javascript - Heapsort 在 Javascript 中不起作用

javascript - 捆绑 ES6 文件而不进行转译

javascript - 使用 concat 将对象添加到数组的正确方法

javascript - Vuex - 仅在 getter 上修改状态对象

javascript - 如何针对特定屏幕尺寸使用 knockout 和 i18next?

c - C中的数组,char类型

php - 如何在 PHP 中将数组转换为字符串?