从items []数组中选择九个项目,随机排列,没有重复

时间:2018-09-18 06:41:49

标签: javascript

我正在尝试从一个数组项目[]中选择一个九位数的项目,将其改组并且不重复。

但是我的代码选择了九个以上的重复项

如何将其更改为只有九个,没有重复项和

怎么可能

我需要做些什么改变?

window.onload = rnumber();
function rnumber() {
  const
    items = [  
      { label: '1', url: '1.jpg'  },
      { label: '2', url: '2.jpg'  },
      { label: '3', url: '3.jpg'  },
      { label: '4', url: '4.jpg'  },
      { label: '5', url: '5.jpg'  },
      { label: '6', url: '6.jpg'  },
      { label: '7', url: '7.jpg'  },
      { label: '8', url: '8.jpg'  },
      { label: '9', url: '9.jpg'  },
      { label: '10',url: '10.jpg' }
          ];

  
var lastnumber=0;
for (let index = 0; index < 9; index++) 
  {
      randomIndex = Math.floor(Math.random() * items.length);
      
	 if(lastnumber!=randomIndex)
	 {
      item = items[randomIndex];
      lastnumber=randomIndex;
	  
	  console.log(item);
	  }
	  else
	  {
	  rnumber();
	  }
	  	 
  }

}

3 个答案:

答案 0 :(得分:1)

您需要选择不替换的项目。选取时,您可以从items数组中删除随机选取的项目:

window.onload = rnumber();

function rnumber() {
  const items = [  
      { label: '1', url: '1.jpg'  },
      { label: '2', url: '2.jpg'  },
      { label: '3', url: '3.jpg'  },
      { label: '4', url: '4.jpg'  },
      { label: '5', url: '5.jpg'  },
      { label: '6', url: '6.jpg'  },
      { label: '7', url: '7.jpg'  },
      { label: '8', url: '8.jpg'  },
      { label: '9', url: '9.jpg'  },
      { label: '10',url: '10.jpg' }
          ];

  const randItems = Array.from(
    { length: 9 },
    () => {
      const randomIndex = Math.floor(Math.random() * items.length);
      const [item] = items.splice(randomIndex, 1);
      return item;
    }
  );
  console.log(randItems);
}

请注意,这将对原始items数组进行变异。如果要保留它(例如带有一副纸牌,以后可以重复使用),请先slice将其复制,然后对切成薄片的副本进行突变;

const slicedItems = items.slice();
// ...
const randomIndex = Math.floor(Math.random() * slicedItems.length);
const [item] = slicedItems.splice(randomIndex, 1);

答案 1 :(得分:0)

使用下划线的随机播放方法:

newitems = _.shuffle(items);
newitems = newitems.splice(0, 9);

请参阅https://underscorejs.org/#shuffle

答案 2 :(得分:0)

我将创建一个索引数组,然后随机排序,然后使用这些索引从数组中选择元素。

 const items = [  
      { label: '1', url: '1.jpg'  },
      { label: '2', url: '2.jpg'  },
      { label: '3', url: '3.jpg'  },
      { label: '4', url: '4.jpg'  },
      { label: '5', url: '5.jpg'  },
      { label: '6', url: '6.jpg'  },
      { label: '7', url: '7.jpg'  },
      { label: '8', url: '8.jpg'  },
      { label: '9', url: '9.jpg'  },
      { label: '10',url: '10.jpg' }
];

// make range array 0 - 8
let randIndexes = Array.from({length: 9}, (_,i) => i)
// shuffle it
randIndexes.forEach((_, i, a) => {
  const j = Math.floor(Math.random() * (i + 1));
  [a[i], a[j]] = [a[j], a[i]];
})

// use the indexes to access the array however you please.
randIndexes.forEach(index => console.log(items[index]))

当然,如果您不介意混淆顺序,则可以直接将items数组洗牌。