我在学校做的项目中遇到了一些代码问题。我有一个长度为4的数组,其中数组的每个元素都是一个整数。通过将Math.random()乘以另一个数组的长度来确定整数的值。我的代码的目标是找到一些方法来检查是否有任何元素彼此相等,如果它们是,那么我想要"重置" (重新定义)它们直到它们不相等。这是我刚才描述的内容,虽然是一种非常基本的形式:
var originalArray=[a, b, c, d, e, f, g];
var or1=Math.floor(Math.random() * originalArray.length);
var or2=Math.floor(Math.random() * originalArray.length);
var or3=Math.floor(Math.random() * originalArray.length);
var or4=Math.floor(Math.random() * originalArray.length);
var numArray=[or1, or2, or3, or4];
function resetData(){
or1=Math.floor(Math.random() * originalArray.length);
or2=Math.floor(Math.random() * originalArray.length);
or3=Math.floor(Math.random() * originalArray.length);
or4=Math.floor(Math.random() * originalArray.length);
numArray=[or1, or2, or3, or4];
}
然后我有另一个函数,在其开始我想运行resetData。但是,如果任何元素彼此相等,那么我希望它再次运行,直到它们都没有。
function startOperations(){
resetData();
//insert other code here
}
我坚持我应该做的事情,只能在前面提到的情况下重置它。我最初的想法是做一个for循环,有点像这样:
for(i=0; i<songNumArray.length-1; i++){
if(songNumArray[i]==songNumArray[i+1]){
resetData();
}
}
但我现在意识到这不会起作用,因为这只会检查彼此相邻的元素是否相等。所以我尝试了一个if语句:
如果(songNumArray [0] == songNumArray [1] || songNumArray [0] == songNumArray [2] || songNumArray [0] == songNumArray [3]){ resetData(); }
当然,这也不起作用,这就是我在这里的原因。这边有人知道我能做些什么吗?
答案 0 :(得分:0)
只需使用另一个for循环再次迭代。像这样:
curl \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "permitted_roles=['GENERAL_USER','REPORTS_ONLY']" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/client_ad_accounts?access_token=<ACCESS_TOKEN>"
答案 1 :(得分:0)
您可以使用像这样的Set来查找重复项:
let dupes;
do {
let set = new Set();
dupes = false;
for (let i = 0; i < songNumArray.length; ++i) {
if (set.has(songNumArray[i]) {
resetData();
dupes = true;
break;
}
else {
set.add(songNumArray[i]);
}
}
} while (dupes);
答案 2 :(得分:0)
我会使用嵌套的for循环。这样,我们可以相互交叉引用数组的所有元素。
function newData() {
for (var i = 0; i < originalArray.length; i++) {
for (var j = 0; j < originalArray.length; j++) {
if (i != j && numArray[i] == numArray[j]) {
console.log('find');
numArray[i] = Math.floor(Math.random() * originalArray.length);
i = 0;
}
}
}
}
如果你看一下if语句,你可以看到我首先检查以确保它不等于j,因为一个数字总是等于它自己,我们不想交叉引用相同的元素阵列。接下来,我检查它们是否相同。如果是,我将i设置为0.这类似于递归,它“重置”或“重新运行”循环。如果数字设置为已存在的数字,它将再次通过if语句,修改它直到满足条件。希望这有帮助!
答案 3 :(得分:0)
不是先为数组的每个元素声明变量,而是稍后将它们放入数组中,我建议只使用数组开始 - 这样就可以使用数组方法了。您也不需要重置数组中所有元素并重试,直到某些工作正常 - 尝试生成新元素并仅在它们通过时插入它们会更优雅。例如:
function createArrayWithoutDuplicates(highestValMinusOne, length) {
const highestVal = highestValMinusOne + 1;
const arr = [];
while (arr.length < length) {
let val;
do {
val = Math.floor(Math.random() * highestVal);
} while (arr.includes(val));
arr.push(val);
}
return arr;
}
console.log(createArrayWithoutDuplicates(10, 7));
console.log(createArrayWithoutDuplicates(10, 7));
console.log(createArrayWithoutDuplicates(10, 7));
console.log(createArrayWithoutDuplicates(10, 7));
console.log(createArrayWithoutDuplicates(10, 7));
console.log(createArrayWithoutDuplicates(10, 7));
答案 4 :(得分:0)
你可以用2 for循环来做,其中第一个是从第一个元素到第二个最后一个元素,第二个循环总是以第一个循环的下一个元素开始,以数组的最后一个元素结束。
for(i = 0; i < songNumArray.length - 1; i++){
for(j = i + 1; j < songNumArray.length; j++) {
if(songNumArray[i] == songNumArray[j]){
resetData();
}
}
}
答案 5 :(得分:0)
我添加了一个getUniqueNumber
函数,如果它是重复的,会生成一个唯一的数字。
以下评论代码;
var originalArray = [1, 2, 3, 4, 5, 6, 7];
var or1 = Math.floor(Math.random() * originalArray.length);
var or2 = Math.floor(Math.random() * originalArray.length);
var or3 = Math.floor(Math.random() * originalArray.length);
var or4 = Math.floor(Math.random() * originalArray.length);
var numArray = [or1, or2, or3, or4];
function getUniqueNumber(index) {
var val = numArray[index];
// check if subsequent values are equal to current value.
// if not return current value.
// no need to check previous values as they are already unique.
if (numArray.indexOf(val, index + 1) === -1)
return val;
// repeat until unique number is generated
while (true) {
val = Math.floor(Math.random() * originalArray.length);
if (numArray.indexOf(val) === -1)
return val;
}
}
function resetData() {
for (let i = 0; i < 4; i++) {
numArray[i] = getUniqueNumber(i);
}
}
function startOperations() {
console.log("before: " + numArray);
resetData();
console.log("after: " + numArray);
//insert other code here
}
startOperations();