使用 reduce() 计数 - 值从何而来?
Counting with reduce() - where the values come from?
在学习过滤掉数组中只出现一次的值时,我遇到了一段非常有用的代码,我根据自己的需要进行了调整。我开始分析一个值的重复计数是如何进行的。下面我有一个进行计数的函数。
function countInstancesOfAppearance(word) {
var letters = word.split('');
return countLetters = letters.reduce(function(object, key) {
object[key] = object[key] ? object[key] + 1 : 1;
return object;
}, {});
}
结果是:{l: 1, a: 1, s: 2, o: 1}
.
但是,我无法理解 object[key] + 1 : 1
背后发生的事情。对我来说更清楚的是用以下方式编写函数:
function countInstancesOfAppearance(word) {
var letters = word.split('');
return countLetters = letters.reduce(function(object, key) {
if (object[key] = object[key]) {
object[key] = object[key] + 1;
} else {
object[key] = 1;
}
return object;
}, {});
}
为了更好地描述我的推理:
var obj = {};
obj.cat = ""; // obj = {cat: ""};
obj.cat + 1 // in console, it gives 1, but the object continues to be obj = {cat: ""};
obj.cat = 1 // only now we have obj = {cat: 1};
obj.cat + 1 // the object continues to be obj = {cat: 1};
obj.cat = obj.cat + 1 //only now we have obj = {cat: 2};
那么,您能否向我解释一下,reduce() 方法是如何利用 obj.cat + 1
或以下条件 object[key] = object[key] ? object[key] + 1 : 1;
中的 1
来进行正确分配的?
这是带有 console.logs 的代码:
function countInstancesOfAppearance(word) {
var letters = word.split('');
return countLetters = letters.reduce(function(object, key) {
console.log("object", object);
console.log("key", key);
console.log("object[key] = object[key]", object[key] = object[key]);
object[key] = object[key] ? object[key] + 1 : 1;
return object;
}, {});
}
它的输出:
检查ternary operator documentation。
object[key] = object[key] ? object[key] + 1 : 1;
可以重写
if (object[key]) { // object[key] alreay exists
object[key] = object[key] + 1; // increment its value
} else {
object[key] = 1; // object[key] does not exist, initialize it with 1
}
条件运算符比赋值运算符higher precedence,所以
object[key] = object[key] ? object[key] + 1 : 1;
相当于
object[key] = (object[key] ? object[key] + 1 : 1);
如果 object[key]
是 undefined
或 0
(因为这些值是假的),则设置为 1
,并在大多数其他情况下递增。
在学习过滤掉数组中只出现一次的值时,我遇到了一段非常有用的代码,我根据自己的需要进行了调整。我开始分析一个值的重复计数是如何进行的。下面我有一个进行计数的函数。
function countInstancesOfAppearance(word) {
var letters = word.split('');
return countLetters = letters.reduce(function(object, key) {
object[key] = object[key] ? object[key] + 1 : 1;
return object;
}, {});
}
结果是:{l: 1, a: 1, s: 2, o: 1}
.
但是,我无法理解 object[key] + 1 : 1
背后发生的事情。对我来说更清楚的是用以下方式编写函数:
function countInstancesOfAppearance(word) {
var letters = word.split('');
return countLetters = letters.reduce(function(object, key) {
if (object[key] = object[key]) {
object[key] = object[key] + 1;
} else {
object[key] = 1;
}
return object;
}, {});
}
为了更好地描述我的推理:
var obj = {};
obj.cat = ""; // obj = {cat: ""};
obj.cat + 1 // in console, it gives 1, but the object continues to be obj = {cat: ""};
obj.cat = 1 // only now we have obj = {cat: 1};
obj.cat + 1 // the object continues to be obj = {cat: 1};
obj.cat = obj.cat + 1 //only now we have obj = {cat: 2};
那么,您能否向我解释一下,reduce() 方法是如何利用 obj.cat + 1
或以下条件 object[key] = object[key] ? object[key] + 1 : 1;
中的 1
来进行正确分配的?
这是带有 console.logs 的代码:
function countInstancesOfAppearance(word) {
var letters = word.split('');
return countLetters = letters.reduce(function(object, key) {
console.log("object", object);
console.log("key", key);
console.log("object[key] = object[key]", object[key] = object[key]);
object[key] = object[key] ? object[key] + 1 : 1;
return object;
}, {});
}
它的输出:
检查ternary operator documentation。
object[key] = object[key] ? object[key] + 1 : 1;
可以重写
if (object[key]) { // object[key] alreay exists
object[key] = object[key] + 1; // increment its value
} else {
object[key] = 1; // object[key] does not exist, initialize it with 1
}
条件运算符比赋值运算符higher precedence,所以
object[key] = object[key] ? object[key] + 1 : 1;
相当于
object[key] = (object[key] ? object[key] + 1 : 1);
如果 object[key]
是 undefined
或 0
(因为这些值是假的),则设置为 1
,并在大多数其他情况下递增。