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

时间:2017-11-22 09:42:32

标签: 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(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
}

2 个答案:

答案 0 :(得分:1)

Math.abs()返回number的绝对值。但是你将绝对值乘以负1.这就是为什么你得到负值

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

答案 1 :(得分:1)

您的代码存在一些缺陷。

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

让我们一步一步地举例说明:

  1. (让我一个人)会给你arrray中的每个值。例如在第一个循环 i = 2
  2. 让posi = Math.abs(i) - 1 会将数组中的数字转换为绝对整数并减去1.现在 posi 将是(2 - 1)= 1。
  3. a [posi] 现在将从索引 1 的数组中获取值 3 (在数组test1中)

  4. if(a [posi]&lt; 0)返回posi + 1 除非数据中有某个负数或 0 ,否则这将永远不会返回(Math.abs(0) - 1 === -1)。

  5. a [posi] = a [posi] * -1 现在您更改数组中的值。在我们的例子中:a [1] = a [1] * -1。这将使数组处于以下状态: [2,-3,3,1,5,2]

  6. 我希望这有助于您了解自己的代码。也许google可以找到解决方案&#34;如何在aray中找到第一个复制品&#34;然后复制一下。