Как выбрать и отобразить наиболее часто используемую строку - PullRequest
0 голосов
/ 06 июня 2019

Создаю новое приложение для сравнения обменных пунктов в научных целях.

Мне нужно выбрать из текста JSON, наиболее часто используемое значение (€, CHF, SEK, $, £) и отобразить его как одно из этих значений (EURO, FRANK, KORONA, DOLAR, FUNT).

function myFunction() {

    text = localStorage.getItem("userHistory");

    obj = JSON.parse(text);

    var iloscEuro = (text.split("€").length -1);

    var iloscCHF = (text.split("CHF").length -1);

    var iloscSEK = (text.split("SEK").length -1);

    var iloscDolar = (text.split("$").length -1);

    var iloscFunt = (text.split("£").length -1);

    alert(Math.max(iloscEuro, iloscCHF, iloscSEK, iloscDolar, iloscFunt));

}

В настоящее время отображается количество использований самой популярной валюты.

Ответы [ 3 ]

1 голос
/ 06 июня 2019

Следует отметить, что ваша строка JSON, вероятно, имеет встроенную структуру, которая сделает его более производительным для анализа, чем использование split(), что крайне медленно.

Однако, поскольку я неЯ знаю, что это за структура. Я пойду с выбранным вами подходом.

Вы можете использовать что-то вроде следующего кода, который будет отображать массив валют и возвращать массив объектов.Каждый объект будет иметь свойство currency и свойство count.Затем вы можете отсортировать массив в порядке убывания по свойству count, поэтому первый элемент в вашем массиве будет равен или больше, чем все остальные.

Преимущество здесь заключается в том, чтоВы получаете счет для всех валют, что может быть полезно, если у вас есть связь между 2 или более валютами для наибольшего представления.

const text = `{"values": [ '€123', 'CHF123', 'CHF456', 'SEK123', '$123', '£123' ]}`;

const currencies = ["€", "CHF", "SEK", "$", "£"];

const counts = currencies
  .map(
    currency =>
      ({
        currency,
        count: text.split(currency).length -1,
      })
  )
  .sort(
    (l, r) =>
      r.count - l.count
  );

console.log( counts );

Если вы просто хотите получить наибольшее, вы можете получить его из своего массива:

counts[0].currency
0 голосов
/ 06 июня 2019

Создание литерала объекта с переводом символов.
Чем вы можете использовать String.prototype.match() для подсчета вхождений в строке

const symb = {'€':'EURO', 'CHF':'FRANK', 'SEK':'KORONA', '$':'DOLAR', '£':'FUNT',};

function countExc(text) {
  const obj = JSON.parse(text), res = {};
  for(k in obj) res[symb[k]] = (obj[k].match(new RegExp(`\\${k}`,'g')) || []).length;
  return res;
}

console.log( countExc(`{"CHF":"1CHF 2CHF", "€":"100€", "$":"1$ 2$ 4$"}`) );
0 голосов
/ 06 июня 2019

Вы можете использовать таблицу сопоставления и метод сокращения.

const text = "CHF CHF CHF € €";
const mappingTable = { "€": "EURO", "CHF": "FRANK" };

let maxOccurenceCount = 0;
const mostFrequentKey = Object.keys(mappingTable).reduce((bestKeySoFar, currentKey) => {
    const currentOccurenceCount = text.split(currentKey).length - 1;
    if (currentOccurenceCount > maxOccurenceCount) {
      maxOccurenceCount = currentOccurenceCount;
      return currentKey;
    }
    return bestKeySoFar;
}, mappingTable[0]);

console.log(mappingTable[mostFrequentKey])
...