我的目标如下:
创建一个函数groupBy,它接受一个数组和一个回调,并返回一个对象。 groupBy将遍历数组并在每个元素上执行回调。回调的每个返回值都将另存为对象上的键。与每个键相关联的值将是一个数组,其中包含所有传递给回调时导致该返回值的元素。
以下代码成功执行:
function groupBy(array, inputFunc) {
let obj = {};
for(let i of array){
let key = inputFunc(i);
// QUESTION on line of code below:
console.log(obj[key])
if(obj[key] === undefined){
obj[key] = [];
}
obj[key].push(i)
}
return obj;
}
// Uncomment these to check your work!
const decimals = [1.3, 2.1, 2.4];
const floored = function(num) { return Math.floor(num); };
console.log(groupBy(decimals, floored)); // should log: { 1: [1.3], 2: [2.1, 2.4] }
但是我对代码有些困惑。具体来说,当我这样做时:
console.log(obj[key])
上面的代码行似乎返回:
undefined
undefined
[ 2.1 ]
undefined
为什么打印未定义?那是哪里来的
因为我不明白undefined的来源,所以我不理解为什么需要if语句。
答案 0 :(得分:0)
这样做的时候
console.log(obj[key])
您不知道对象是否具有密钥;毕竟,只有之后才为该键分配一个数组,如果没有关联的值:
if(obj[key] === undefined){
obj[key] = [];
}
因此,在每次迭代中,如果尚未将要迭代的键放入对象,它将记录undefined
,随后在同一迭代中,将为该键分配一个空数组对象。
例如,在第一次迭代中,i
是1.3
,因此生成的密钥是let key = inputFunc(i);
-> let key = inputFunc(1.3);
-> let key = 1
。但是对象开始时根本没有键,所以
obj[1]
求值为undefined
,后面的if
语句检测到此情况,并为该键分配一个数组:
if(obj[key] === undefined){
obj[key] = [];
}
在第一次迭代中,解析为
if(obj[1] === undefined){
obj[1] = [];
}
// ->
if(undefined === undefined){
obj[1] = [];
}
您还可以考虑使用reduce
来代替,它在将数组转换为奇异值时功能更强大,并且可以说更合适:
const groupBy = (array, inputFunc) => array.reduce((a, elm) => {
const key = inputFunc(elm);
if (!a[key]) {
a[key] = [];
}
a[key].push(elm);
return a;
}, {});
const decimals = [1.3, 2.1, 2.4];
const floored = function(num) { return Math.floor(num); };
console.log(groupBy(decimals, floored)); // should log: { 1: [1.3], 2: [2.1, 2.4] }
答案 1 :(得分:0)
因为它显示该项是否存在。如果不是,则转到if
语句。将console.log
放在if
语句之后,以删除所有undefined
。
function groupBy(array, inputFunc) {
let obj = {};
for (let i of array) {
let key = inputFunc(i);
if (obj[key] === undefined) {
obj[key] = [];
}
console.log(obj[key]);
obj[key].push(i);
}
return obj;
}
const decimals = [1.3, 2.1, 2.4];
const floored = function(num) {
return Math.floor(num);
};
console.log(groupBy(decimals, floored));
.as-console-wrapper { max-height: 100% !important; top: auto; }
请注意,不需要-如果您只需要从函数返回的obj
:
function groupBy(array, inputFunc) {
let obj = {};
for (let i of array) {
let key = inputFunc(i);
if (obj[key] === undefined) {
obj[key] = [];
}
obj[key].push(i);
}
return obj;
}
const decimals = [1.3, 2.1, 2.4];
const floored = function(num) {
return Math.floor(num);
};
console.log(groupBy(decimals, floored));
.as-console-wrapper { max-height: 100% !important; top: auto; }