数组中出现奇数次的值 - 这里发生了什么?

value in array that occurs odd number of times- what is happening here?

我在检查如何查找出现奇数次的数字时遇到了这段代码。 我试图理解一切,但我无法弄清楚。 请逐步说明发生了什么以及每个变量的含义。

谢谢!

function findOdd(A) {
    let counts = A.reduce((p, n) => (p[n] = ++p[n] || 1, p), {});
    return +Object.keys(counts).find(k => counts[k] % 2) || undefined;


这里使用了2个方法,你需要了解一下。

  1. reduce : 在这里阅读 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce

  2. 在此处查找相关信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find

下面的语句制作了一个数字与其出现的映射

let counts = A.reduce((p, n) => (p[n] = ++p[n] || 1, p), {})

然后第二个语句在映射中搜索出现奇数次的元素,如果没有找到这样的元素,则它会找到 returns undefined

return +Object.keys(counts).find(k => counts[k] % 2) || undefined

  • reduce 是一种数组方法,它应该将数组缩减为单个值,它可以是数组本身、对象或任何平面变量类型
  • reduce 将一个函数和一个初始累积对象作为参数
  • 为数组中的每个元素调用该函数,并将累积对象作为第一个参数 (p) 传递,将单个数组项作为第二个参数 (n)
  • 本例中的函数是 arrow function expression
  • 函数体由comma operator连接的两个表达式组成。结果是逗号运算符 return 最右边的表达式,在本例中为 p.
  • 如果没有设置p[n],逗号运算符(p[n] = ++p[n] || 1)的第一个表达式将return 1,否则将递增p[n]和return结果。感谢逻辑或的short-circuit evaluation(||)
  • 这可以写得更详细一点
A.reduce(function (p, n) {
  if (p[n]) {
    p[n] = p[n] + 1
  } else {
    p[n] = 1
  }
  return p
}, {});
  • 因此您收到一个对象,它计算数组中每个值的出现次数

  • 然后你有 return 语句,它将 return counts 的第一个键具有奇数值

  • 它首先创建一个 countsObject.keys 的键数组。
  • 然后遍历这些键并检查每个键对应的值的 modulo division 乘以 2 (% 2) 是否为真值(在本例中不是零)然后return 那把钥匙。
  • 它将始终 return 第一个键 属性
  • 最后这个找到的值被转换为一个数字 unary plus operator
  • 如果没有找到值,undefined 是 returned