Выбрать случайный элемент массива из строки, но одна и та же строка всегда возвращает один и тот же элемент. Псевдослучайного - PullRequest
0 голосов
/ 03 апреля 2019

У меня есть массив возможных цветов в Javascript:

possibleColors = [
        "#10ace3",
        "#f26529",
        "#c62328",
        "#e53434",
        "#ffba49",
        "#99c24d",
        "#7e1d1d"
      ]

Учитывая строку (имя человека), я хотел бы всегда выбирать один и тот же цвет случайным образом.

В качестве примера:

"Sergio" would always return the first color.
"Daniel" would always return the fourth color.
etc.

Есть предложения, как это сделать?Пожалуйста, не принимайте мой пример буквально. Я имею в виду, что одна и та же строка должна возвращать тот же цвет.

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

Вам понадобится использовать какое-то хранилище, такое как localStorage или внутреннюю базу данных, такую ​​как MySQL

Поскольку SO не поддерживает фрагменты localStorage, вот код jsfiddle приведенного ниже кода:

const possibleColors = [
        "#10ace3",
        "#f26529",
        "#c62328",
        "#e53434",
        "#ffba49",
        "#99c24d",
        "#7e1d1d"
      ]

function getColor(str) {
  // Attempt the get the item from local storage (returns null otherwise)
  let color = localStorage.getItem(str)
  if(!color) {
    // Nothing was in local storage, select a random color
    color = possibleColors[Math.floor(Math.random() * possibleColors.length)]
    // Save the color to local storage for use next time
    localStorage.setItem(str, color)
  }
  // Return the color that was or now is in local storage
  return color
}

console.log('jim', getColor('jim'))
console.log('bob', getColor('bob'))

console.log('jim', getColor('jim'))
console.log('brass monkey', getColor('brass monkey'))
console.log('jim', getColor('jim'))

console.log('brass monkey', getColor('brass monkey'))
console.log('brass monkey', getColor('brass monkey'))

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

// Example possible output:
//
// jim           #7e1d1d
// bob           #c62328
// jim           #7e1d1d
// brass monkey  #e53434
// jim           #7e1d1d
// brass monkey  #e53434
// brass monkey  #e53434
0 голосов
/ 03 апреля 2019

Просто сохраните имя человека и его цвет, если он новый человек, пусть принесет ему случайный цвет, в противоположность верните его цвет.

const possibleColors = [
  "#10ace3",
  "#f26529",
  "#c62328",
  "#e53434",
  "#ffba49",
  "#99c24d",
  "#7e1d1d"
];

let  getColor = (function() {
  let cache = {};
  let f = function(name) {
    if (!cache[name]) {
      cache[name] = possibleColors[Math.floor(Math.random() * possibleColors.length)];
    }

    return cache[name];
  }
  return f;
})();

console.log(getColor('Sergio'));
console.log(getColor('Sergio'));
console.log(getColor('Sergio'));

console.log(getColor('Daniel'));
console.log(getColor('Daniel'));
console.log(getColor('Daniel'));
0 голосов
/ 03 апреля 2019

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

Если вы знаете имя заранее, тогда вы простосоздайте карту для возврата того же цвета.

В любом случае необходимо создать какое-либо отображение сорта.

Например:

const nameColorMap = new Map()
const possibleColors = [ "#10ace3", "#f26529", "#c62328", "#e53434", "#ffba49", "#99c24d", "#7e1d1d"]

function getColorForName(name) {
  if (!nameColorMap.has(name)) {
    const color = possibleColors[Math.round(Math.random() * possibleColors.length)]
    nameColorMap.set(
      name,
      color,
    )
  }

  return nameColorMap.get(name)
}

https://repl.it/@baruchvlz/GrubbyAgonizingOffice

...