首页 > 解决方案 > 从数组中获取两个随机的非连续且唯一的元素

问题描述

嗨,我正在尝试从不连续的列表中获取两个唯一的随机元素。数组形成如下

[
  {"id": 1, "name": "Monday", "workers": []},
  {"id": 2, "name": "Tuesday", "workers": []},
  {"id": 3, "name": "Wednesday", "workers": []},
  {"id": 4, "name": "Thursday", "workers": []},
  {"id": 5, "name": "Friday", "workers": []},
]

我设法获得了以下两个独特的元素:

 getTwoNonConsecutiveDays = () => {
    var days = require('./weeks.json');

    let selected = [];
    let randomday = () => {
      const shuffled = days.sort(() => 0.5 - Math.random());

      // Get sub-array of first n elements after shuffled
      selected = shuffled.slice(0, 2);


但是,当我试图使条件不连续时不起作用

      if (selected[0].id === selected[1].id) {

     console.log('greseala')}

     selected[0].id

标签: javascriptarraysalgorithm

解决方案


你可以这样去:

  • 选择 3 个后续项目的随机居中窗口(如果从第一个数组项目开始,则为 2 个)并将中间的一个作为第一个项目
  • 删除选定的三元组(例如使用Array.prototype.splice())以避免选择第一个随机项目或其邻居
  • 从剩下的那些中随机选择第二个随机项目

const src = [{"id":1,"name":"Monday","workers":[]},{"id":2,"name":"Tuesday","workers":[]},{"id":3,"name":"Wednesday","workers":[]},{"id":4,"name":"Thursday","workers":[]},{"id":5,"name":"Friday","workers":[]}],

     getRandomPair = ([...a]) => {
        const {random} = Math,
              windowPos = 0|random()*(a.length-1),
              e1 = a.splice(windowPos, windowPos ? 3 : 2)[windowPos && 1],    
              e2 = a[0|random()*a.length]
        return [e1,e2]
      }
      
console.log(getRandomPair(src))
.as-console-wrapper{min-height:100%;}


推荐阅读