在此代码中执行的三元运算符的真实值在哪里?
Where is the truthy value for the ternary operator to execute upon in this code?
这个编码问题的一些背景知识。我们的 termTopics 函数需要计算每个主题在调查中被提及的次数,然后 return 一个包含提及次数的数组,顺序如下:智慧城市、艺术基金,然后是交通。
const termTopics = (interviews) => {
const count = interviews.reduce((acc, cv) => {
return {...acc, [cv]: acc[cv] ? acc[cv]+1 : 1}
}, {})
return [count['smart city'], count['arts funding'], count['transportation']];
}
我无法理解的是展开运算符,以及它如何为三元运算符创建一个真实的语句来进行运算。
真实(或虚假)值来自此处:acc[cv]
如果有值,则将其递增 1,否则将其设置为 1。
acc[cv]
是 计算出的 属性 并将查找 cv
的值作为 属性 的 acc
,例如 acc['smart city']
.
传播语法和条件运算符在这里完全无关。让我们在这里来回展开:
- 整个条件运算符表达式是
acc[cv] ? acc[cv]+1 : 1
,因此它将根据acc[cv]
是否为真来解析为acc[cv]+1
或1
。
- 条件运算符的结果赋值给一个对象中的属性。
- 属性 名称是
[cv]
- 一个 computed property name 等于 cv
的当前值。
- 属性 名称和值已添加到对象。
- 其余对象值为
...acc
或对象的当前值为 spread into the object。
实际上,{...acc, [cv]: acc[cv] ? acc[cv]+1 : 1}
是以下 ES5 代码的较短版本:
var result = {};
//{...acc}
for (var key in acc) {
result[key] = acc[key];
}
//[cv]: acc[cv] ? acc[cv]+1 : 1
if (acc[cv]) {
result[cv] = acc[cv]+1;
} else {
result[cv] = 1;
}
const count = interviews
.reduce((resultObject, interview) => {
// We are creating an object through the reduce function by iterating through the interviews array.
// At each iteration we will modify the result object according to the current array interview item value
return {
// First we copy the object we have so far
...resultObject,
// Then we set the property corresponding to the current item
[interview]: resultObject[interview]
// If it is not the first time we have seen this item, the object property already exists and we update it by adding one to its value
? resultObject[interview] + 1
// Otherwise we create a new property and set it to one
: 1
}
}, {})
这个编码问题的一些背景知识。我们的 termTopics 函数需要计算每个主题在调查中被提及的次数,然后 return 一个包含提及次数的数组,顺序如下:智慧城市、艺术基金,然后是交通。
const termTopics = (interviews) => {
const count = interviews.reduce((acc, cv) => {
return {...acc, [cv]: acc[cv] ? acc[cv]+1 : 1}
}, {})
return [count['smart city'], count['arts funding'], count['transportation']];
}
我无法理解的是展开运算符,以及它如何为三元运算符创建一个真实的语句来进行运算。
真实(或虚假)值来自此处:acc[cv]
如果有值,则将其递增 1,否则将其设置为 1。
acc[cv]
是 计算出的 属性 并将查找 cv
的值作为 属性 的 acc
,例如 acc['smart city']
.
传播语法和条件运算符在这里完全无关。让我们在这里来回展开:
- 整个条件运算符表达式是
acc[cv] ? acc[cv]+1 : 1
,因此它将根据acc[cv]
是否为真来解析为acc[cv]+1
或1
。 - 条件运算符的结果赋值给一个对象中的属性。
- 属性 名称是
[cv]
- 一个 computed property name 等于cv
的当前值。 - 属性 名称和值已添加到对象。
- 其余对象值为
...acc
或对象的当前值为 spread into the object。
实际上,{...acc, [cv]: acc[cv] ? acc[cv]+1 : 1}
是以下 ES5 代码的较短版本:
var result = {};
//{...acc}
for (var key in acc) {
result[key] = acc[key];
}
//[cv]: acc[cv] ? acc[cv]+1 : 1
if (acc[cv]) {
result[cv] = acc[cv]+1;
} else {
result[cv] = 1;
}
const count = interviews
.reduce((resultObject, interview) => {
// We are creating an object through the reduce function by iterating through the interviews array.
// At each iteration we will modify the result object according to the current array interview item value
return {
// First we copy the object we have so far
...resultObject,
// Then we set the property corresponding to the current item
[interview]: resultObject[interview]
// If it is not the first time we have seen this item, the object property already exists and we update it by adding one to its value
? resultObject[interview] + 1
// Otherwise we create a new property and set it to one
: 1
}
}, {})