数组突变

时间:2019-12-09 14:21:09

标签: javascript arrays loops methods

由于某种原因,我无法获得预期的代码。

我已经声明了带有随机15个元素的dna变量,它的每个元素都是dnaBases数组中的随机字母。

Mutate函数应该使用随机的15个元素创建新的(相似的数组),但是第一个数组中的元素不能重复。相反,应将它们替换为dnaBases数组中其余的三个元素。

我的代码中的问题是,有时字母会重复,即使在以前的情况下字母没有重复。

const dnaBases = ['A', 'T', 'C', 'G']
var dna = []
for (let i = 0; i < 15; i++) {
  dna.push(dnaBases[Math.floor(Math.random() * 4)])
}

function mutate() {
  console.log(dna) // to check newly generated dna array
  var tmp = []
  var newDnaBases = ['A', 'T', 'C', 'G']
  for (var j = 0; j < 15; j++) {
    tmp.push(newDnaBases[Math.floor(Math.random() * 4)]);
  }

  console.log(tmp) // to check newly generated tmp array

  for (var k = 0; k < tmp.length; k++) {
      var randomIndex = Math.floor(Math.random() * 3);
      if (tmp[k] === dna[k]) {
        var x = newDnaBases.splice(tmp[k], 1);
        tmp[k] = newDnaBases[randomIndex];
        newDnaBases.push(x.toString());
      }
  }
  console.log(tmp) // to see how tmp has changed after for loop
  console.log(newDnaBases) // to check if newDnaBases is not corrupted
}

mutate()

我是Java语言的新手,乍看之下看不到问题。

非常感谢!

1 个答案:

答案 0 :(得分:0)

在js中,像 split,slice ou reduce 这样的数组方法用于返回数组变量的“克隆”以及该方法所应用的更改。 喜欢

a = [1,2,3]
b = a.filter(i => {
      if (i === 2) {
        return true
      } else {
        return false
      }
})
b[0] === 2 // true
a[2] === 3 // true

所以在您的代码中:

const dnaBases = ['A', 'T', 'C', 'G']
var dna = []
for (let i = 0; i < 15; i++) {
  dna.push(dnaBases[Math.floor(Math.random() * 4)])
}

function mutate() {
  console.log(dna) 
  var tmp = []
  var newDnaBases = ['A', 'T', 'C', 'G']
  for (var j = 0; j < 15; j++) {
    tmp.push(newDnaBases[Math.floor(Math.random() * 4)]);
  }

  console.log(tmp) // to check newly generated tmp array

  for (var k = 0; k < tmp.length; k++) {
      var randomIndex = Math.floor(Math.random() * 3);
      if (tmp[k] === dna[k]) {
        var x = newDnaBases.filter(i=> i!== tmp[k]) //returns the array without the repeated item, without altering the original variable
        tmp[k] = x[Math.floor(Math.random() * 2)];
      }
  }
  console.log(tmp)
  console.log(newDnaBases) 
}

mutate()