如何在js中获取数组的非重复索引?

时间:2018-09-20 15:24:53

标签: javascript arrays duplicates

我有一个有时会更新的数组,所以数组的大小是任意的。

我想从数组中获得一个非重复的索引(注意:不是索引处的元素,而是索引)。

该程序每1000毫秒运行一次,我正在尝试获取唯一索引。

这是我到目前为止所拥有的:

randomIndex = data => {
  let rand = Math.floor(Math.random() * data.length);
  if (rand !== Math.floor(Math.random() * data.length)) {
    return rand;
  } else {
    return Math.floor(Math.random() * data.length);
  }
};

但是仍然会返回重复值

编辑

假设我们有data = ['bob', 'charli', 'kate']

我想获得一个随机指数e.i. 0或1或2。

因为我目前有setInterval(() => {}, 1000),所以我在1000秒后得到了相同的索引,这不是我想要的。因此,每一秒钟,我需要一个不同的索引。

更新

请注意,当我说不重复时,我的意思是我不希望同一索引连续出现。

所以说1s之后我们有索引1,然后是1,我想要0或2。

4 个答案:

答案 0 :(得分:1)

您需要跟踪索引的历史记录,以避免重复。本示例还使用递归来继续尝试查找唯一索引。如果没有唯一的变量,请重置历史记录数组。希望这会有所帮助!

编辑:

看起来您实际上不需要跟踪“历史记录”,而只需跟踪最后选择的索引。这应该可以让您到达需要的地方。

let people = ['bob', 'charli', 'kate', 'bobby', 'jake', 'john', 'jerry', 'isaac'];
let lastIndex;

getRandIndex = (data) => {
  let rand = Math.floor(Math.random() * (data.length));
  if (!lastIndex) {
    lastIndex = rand;
    return rand
  }
  if (rand != lastIndex) {
    lastIndex = rand;
    return rand;
  } else {
    return getRandIndex(data);
  }
};

setInterval(() => {
  console.log(getRandIndex(people))
}, 1000)

答案 1 :(得分:0)

要执行任务,您需要使用/matchup-history?matchup_type=regular&owner_id=98765语言构造,如果当前随机数与最后一个相同,它将继续生成一个新的随机数。

下面是一段说明:

  

在代码段中,我将使用do...while方法,该方法不允许回调函数(第一个参数)返回值,因此您可以将生成的数字分配给变量,然后停止通过使用setInterval方法使用参考变量(分配给setInterval方法的变量)的时间间隔。而且,我在5秒后结束间隔。

clearInterval
 

希望我进一步推动了你。

答案 2 :(得分:0)

只需此功能:

let people = ['bob', 'charli', 'kate', 'bobby', 'jake', 'john', 'jerry', 'isaac'];

getRandIndex = (data, noRepeat) => {
  rand = Math.floor(Math.random() * (data.length));
  while(noRepeat === rand) {
    rand = Math.floor(Math.random() * (data.length));
  }
  
  return rand;
  
};

let r = -1;

setInterval(() => {  
  r = getRandIndex(people, r);
  
  console.log(r);
  
}, 1000)

答案 3 :(得分:0)

一种简单而干净的方法

let previous = 0;
getRandIndex = (data) => {
  const rand = Math.floor(Math.random() * data.length);
  if(rand == previous) return getRandIndex(data);
  previous = rand;
  return rand;
};