JavaScript получает 3 уникальных случайных объекта из массива

#javascript #jquery

#javascript #jquery

Вопрос:

Что я пытаюсь сделать, так это показать случайное имя, я уже получил его, но я хочу показать 3 случайных имени из объекта, а также уникальные, я имею в виду, не показывать дубликаты. как я могу это сделать?

 var items = [{name: 'Tom', phone: '12321'}, {name: 'Jerry', phone: '235677'}, {name: 'Mike', phone: '11209765'}, {name: 'Robert', phone: '5345'}, {name: 'Danny', phone: '1247774'}, {name: 'Josef', phone: '1199900'}, {name: 'Rainbow', phone: '12675'}, {name: 'Avi', phone: '12344'}, {name: 'Shani', phone: '12222767'}];

var item1 = items[Math.floor(Math.random() * items.length)];
var item2 = items[Math.floor(Math.random() * items.length)];
var item3 = items[Math.floor(Math.random() * items.length)];

$('#Name-1').text('Name 1: ' item1.name);
$('#Name-2').text('Name 2: ' item2.name);
$('#Name-3').text('Name 3: ' item3.name);  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="Name-1"></div>
<div id="Name-2"></div>
<div id="Name-3"></div>  

Это работает, но иногда показывает дубликаты, например:

 Name 1: Danny
Name 2: Mike
Name 3: Mike
  

Комментарии:

1. Зачем закрывать мой вопрос?? это не мой ответ!

2. Почему … потому что уже есть много похожих вопросов. Разве ссылка выше не делает то, что вам нужно?

3. @charlietfl нет, я не спрашивал, как создать случайный массив! Я спросил, как показать 3 уникальных! случайный массив из объекта

4. Первый ответ подсказывает вам очень правильный подход и объясняет как «Вы могли бы перетасовать массив и выбрать первые четыре». которых в вашем случае было бы только три. Как это не решает вашу проблему? Немного поискав самостоятельно, вы могли бы найти и другие подходы

5. Я согласен с @charlietfl, вопрос следует закрыть как дублирующий, поскольку в нем никогда ничего не упоминается о сохранении значения и никогда не показывать их снова, если они были просмотрены один раз. Оператору необходимо добавить спецификацию требований , чтобы вопрос НЕ был закрыт как дубликат в первую очередь!

Ответ №1:

Это сработает в вашем случае. Удаление выбранного элемента из массива. Это всегда будет давать вам уникальные значения.

 var items = [{
  name: 'Tom',
  phone: '12321'
}, {
  name: 'Jerry',
  phone: '235677'
}, {
  name: 'Mike',
  phone: '11209765'
}, {
  name: 'Robert',
  phone: '5345'
}, {
  name: 'Danny',
  phone: '1247774'
}, {
  name: 'Josef',
  phone: '1199900'
}, {
  name: 'Rainbow',
  phone: '12675'
}, {
  name: 'Avi',
  phone: '12344'
}, {
  name: 'Shani',
  phone: '12222767'
}];

function getRandom(items) {

  let names = [];
  let first = Math.floor(Math.random() * items.length);
  names.push(items[first].name);
  items.splice(first, 1);
  let second = Math.floor(Math.random() * items.length);
  names.push(items[second].name);
  items.splice(second, 1);
  let third = Math.floor(Math.random() * items.length);
  names.push(items[third].name);
  return names;
}

console.log(getRandom([...items]));  

Комментарии:

1. Использование 3 для вычисления индекса означает, что вы никогда не увидите ни одного из элементов после первых 5 или 6 в массиве. Вычисления должны основываться на общей длине. Также можно было бы преобразовать этот код в простой цикл без всех повторений