簡體   English   中英

如何根據從字符串數組中求和的對應值返回字符串

[英]How to return a string based on correspondent values summed from an array of strings

正如該主題所述,最好的方法是什么,以便在傳遞情緒/值數組時,根據 javascript 中的數字映射顯示最接近的值?

假設“Glad”與“Happy”是一回事,“Down”與“Sad”是一回事。 我試過的代碼看起來非常冗長,如果我添加更多的情緒/狀態(即憤怒),它就會變得臃腫。 除了情緒數組,任何新的函數、數據結構和變量都可以改變/引入。

例如,我可以得到一個情緒列表:

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"

假設我添加了第四種情緒/感覺......我會添加越來越多的這些條件,並且在對數字范圍的邏輯檢查中變得更加復雜。

我正在查看整個情緒列表,並試圖提出代表整個列表的整體情緒。

這樣做的最佳方法是什么,以便代碼看起來干凈並且我可以支持更多狀態而不會使代碼行變得太長?

這樣的事情怎么樣:

有兩個對象常量:
emotionsValues值:在這里你為你想要的每種情緒分配一個值,就像每個情緒的分數一樣。
emotionsRank排名:這是每個值的最終結果,基於平均你將從這里得到的結果。

現在:

  1. 通過參數接收情緒數組。

  2. 根據每個映射情感的值來reduce它(使用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))

  • 您可以創建函數 emo 到 value 和它的倒數:value to emotionS:
  • 然后你將數組中找到的每個情緒映射到它的值
  • 做你標准的數學題
  • 並通過互惠函數回到情緒

 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

您可以創建一組索引並通過使用索引過濾來獲取值。

 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));

此函數明確檢查“中”情況以及超出范圍的值(因為它基於索引):

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM