0

我试图从数组 item[] 中选择一个九号项目,并且没有重复。

但我的代码选择了九个以上,有重复

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

这怎么可能

我必须做出什么改变才能使它成为可能?

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();
	  }
	  	 
  }

}

4

3 回答 3

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);
于 2018-09-18T06:44:57.913 回答
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如果您不介意混淆顺序,您可以直接洗牌。

于 2018-09-18T07:01:54.157 回答
0

使用下划线的 shuffle 方法:

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

https://underscorejs.org/#shuffle

于 2018-09-18T06:46:58.477 回答