数组中出现奇数次的值 - 这里发生了什么?
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个方法,你需要了解一下。
reduce : 在这里阅读 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
在此处查找相关信息: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
的第一个键具有奇数值
- 它首先创建一个
counts
和 Object.keys
的键数组。
- 然后遍历这些键并检查每个键对应的值的 modulo division 乘以 2 (
% 2
) 是否为真值(在本例中不是零)然后return 那把钥匙。
- 它将始终 return 第一个键 属性
- 最后这个找到的值被转换为一个数字 unary plus operator
- 如果没有找到值,undefined 是 returned
我在检查如何查找出现奇数次的数字时遇到了这段代码。 我试图理解一切,但我无法弄清楚。 请逐步说明发生了什么以及每个变量的含义。
谢谢!
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个方法,你需要了解一下。
reduce : 在这里阅读 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
在此处查找相关信息: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
)的第一个表达式将return1
,否则将递增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
语句,它将 returncounts
的第一个键具有奇数值- 它首先创建一个
counts
和Object.keys
的键数组。 - 然后遍历这些键并检查每个键对应的值的 modulo division 乘以 2 (
% 2
) 是否为真值(在本例中不是零)然后return 那把钥匙。 - 它将始终 return 第一个键 属性
- 最后这个找到的值被转换为一个数字 unary plus operator
- 如果没有找到值,undefined 是 returned