Javascript中的Math.Abs()-数组意外

Javascript中的Math.Abs()-数组意外,javascript,arrays,typescript,ecmascript-6,Javascript,Arrays,Typescript,Ecmascript 6,若我在Math.abs()中传递数组,我无法理解它为什么返回-3,为什么我的值从正变为负 let test1 = [2, 3, 3, 1, 5, 2] let test2 = [2, 4, 3, 5, 1] function firstDuplicate(a) { for (let i of a) { console.log(i); let posi = Math.abs(i) - 1; //console.log(posi); } } console.log(

若我在Math.abs()中传递数组,我无法理解它为什么返回-3,为什么我的值从正变为负

let test1 = [2, 3, 3, 1, 5, 2]
let test2 = [2, 4, 3, 5, 1]
function firstDuplicate(a) {
  for (let i of a) {
    console.log(i);
    let posi = Math.abs(i) - 1;
    //console.log(posi);
  }

}
console.log(firstDuplicate(test1))
console.log(firstDuplicate(test2))
我不明白Math.abs是怎么工作的,下面是真正的代码

function firstDuplicate(a) {
  for (let i of a) {
    let posi = Math.abs(i) - 1
    if (a[posi] < 0) return posi + 1
    a[posi] = a[posi] * -1
  }

  return -1
}
函数firstDuplicate(a){
为了(让我举个例子){
设posi=Math.abs(i)-1
如果(a[posi]<0)返回posi+1
a[posi]=a[posi]*-1
}
返回-1
}
Math.abs()返回数字的绝对值。但是你用你的绝对值乘以负1。这就是为什么你会得到负值

a[posi] = a[posi] * -1
abs()返回数字的绝对值。但是你用你的绝对值乘以负1。这就是为什么你会得到负值

a[posi] = a[posi] * -1

你的代码有一些缺陷

  for (let i of a) { 
    let posi = Math.abs(i) - 1
    if (a[posi] < 0) return posi + 1
    a[posi] = a[posi] * -1
  }
对于(a的设i){
设posi=Math.abs(i)-1
如果(a[posi]<0)返回posi+1
a[posi]=a[posi]*-1
}
让我们通过一个示例一步一步地完成此步骤:

  • (设i为a)将给出数组中的每个值。e、 g.在第一个回路上i=2
  • 让posi=Math.abs(i)-1将数组中的数字转换为绝对整数并减去1。现在posi将是(2-1)=1
  • a[posi]现在将从索引1处的数组中获取值,即3(在数组test1中)

  • 如果(a[posi]<0)返回posi+1这将永远不会返回,除非数据中有负数或0(Math.abs(0)-1=-1)

  • a[posi]=a[posi]*-1现在更改数组中的值。在我们的示例中:a[1]=a[1]*-1。这将使阵列保持以下状态:[2,-3,3,1,5,2]


  • 我希望这能帮助您理解自己的代码。也许谷歌可以找到“如何在aray中找到第一个副本”的解决方案,然后复制它。

    您的代码有一些缺陷

      for (let i of a) { 
        let posi = Math.abs(i) - 1
        if (a[posi] < 0) return posi + 1
        a[posi] = a[posi] * -1
      }
    
    对于(a的设i){
    设posi=Math.abs(i)-1
    如果(a[posi]<0)返回posi+1
    a[posi]=a[posi]*-1
    }
    
    让我们通过一个示例一步一步地完成此步骤:

  • (设i为a)将给出数组中的每个值。e、 g.在第一个回路上i=2
  • 让posi=Math.abs(i)-1将数组中的数字转换为绝对整数并减去1。现在posi将是(2-1)=1
  • a[posi]现在将从索引1处的数组中获取值,即3(在数组test1中)

  • 如果(a[posi]<0)返回posi+1这将永远不会返回,除非数据中有负数或0(Math.abs(0)-1=-1)

  • a[posi]=a[posi]*-1现在更改数组中的值。在我们的示例中:a[1]=a[1]*-1。这将使阵列保持以下状态:[2,-3,3,1,5,2]


  • 我希望这能帮助您理解自己的代码。也许谷歌可以找到一个关于“如何在aray中找到第一个副本”的解决方案,然后复制它。

    请添加结果和想要的结果。请注意,您正在与-1 a[posi]=a[posi]*-1相乘,请同时添加结果和想要的结果。请注意,您正在与-1 a[posi]=a[posi]相乘*-1请您解释一下这段代码,因为我无法理解它是如何找到需要作为另一个问题提问的第一个重复项的。请您解释一下这段代码,因为我无法理解它是如何找到需要作为另一个问题提问的第一个重复项的。谢谢Fabian,这段代码来自谷歌,工作非常完美,但我不知道这段代码如何正常工作并给出预期结果Hanks Fabian,这段代码来自谷歌,工作非常完美,但我不知道这段代码如何正常工作并给出预期结果