如果任何元素相等,则重置数组中的数据

时间:2018-03-20 02:20:16

标签: javascript

我在学校做的项目中遇到了一些代码问题。我有一个长度为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();     }

当然,这也不起作用,这就是我在这里的原因。这边有人知道我能做些什么吗?

6 个答案:

答案 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();