繁体   English   中英

JavaScript:创建一个接受数组和回调的函数groupBy,并返回一个对象

[英]JavaScript: Create a function groupBy that accepts an array and a callback, and returns an object

我的目标如下:

创建一个接受数组和回调的函数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

为什么打印未定义? 它来自哪里?

因为我不明白未定义的来源,我不理解为什么需要if语句。

当你这样做

console.log(obj[key])

你不知道对象是否有关键; 毕竟,只有之后你才为这个键分配一个数组,如果没有相关的值:

if(obj[key] === undefined){
  obj[key] = [];
}

因此,在每次迭代时,如果迭代的键尚未被放到对象上,它将记录undefined ,稍后在同一次迭代中,将为该对象上的该键分配一个空数组。

例如,在第一次迭代中, i1.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] } 

因为它显示项目是否存在。 如果没有,则转到if语句。 if语句之后放置console.log以删除所有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; } 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM