javascript - JavaScript:函数创建数组作为返回对象的值
问题描述
我正在创建一个接受数组和回调并返回对象的函数。它旨在遍历数组并对每个元素执行回调。然后,回调的每个返回值都保存为对象的键。与每个键关联的值将是一个数组,该数组由传递给回调时产生该返回值的所有元素组成。
function groupBy(array, callback) {
let obj = {};
let newArr = [];
//loop through each ele w/ callback
//return value saved as key in obj obj[key] = value
array.forEach(ele => {
let key = callback(ele)
obj[key] = callback(ele);
if (obj[key] === undefined) {
obj[key] = array[ele]
newArr.push(array[ele]);
} else {
newArr.push(obj[key]);
}
});
return obj;
}
该函数应该创建数组作为返回对象的值,但它没有。此外,如果回调在传入时返回相同的值,它不会将数组项组合在一起。
测试用例:
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: 1, 2: 2 }</be expected { odd: 'odd', even: 'even' } 深度等于 {odd: [ 1, 3, 5 ], even: [ 2, 4 ] }
解决方案
您的代码存在不止 1 个问题。
首先,您正在使用obj[key] = callback(ele)
分配key
给object[key]
其次,您正在推入newArr
阵列但从不使用它。
下面的片段可能会对您有所帮助。
function groupBy(array, callback) {
let obj = {};
//loop through each ele w/ callback
//return value saved as key in obj obj[key] = value
array.forEach(ele => {
let key = callback(ele)
obj[key] = obj[key] || [];
// ^^^^ Create an empty array if it doesn't exist
obj[key].push(ele)
});
return obj;
}
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] }**
更新
你也可以使用Array.reduce()
function groupBy(array, callback) {
return array.reduce((acc,cur) => {
let key = callback(cur)
acc[key] = acc[key] || [];
acc[key].push(cur)
return acc;
},{})
}
const decimals = [1.3, 2.1, 2.4];
const floored = function(num) {
return Math.floor(num);
};
console.log(groupBy(decimals, floored));
推荐阅读
- spring-boot - 外部化配置中的角色名称
- php - php从mysql中查找现有数据
- android - 为什么在 Looper.getMainLooper() 中接收垃圾数据
- ios - ios - (推送通知)当我调用 getNotificationSettings 时,alertSetting 返回 NotSupported
- javascript - Javascript 承诺未按预期顺序解决
- c# - 具有过时版本的应用程序中的实体框架迁移
- java - @autowired 在 Springboot 中究竟做了什么
- c# - 带半径的随机点
- python - 正则表达式嵌套在 Positive Lookbehind 中
- applescript - 终端:在 MacOS Mojave 10.14 中将项目添加到辅助功能访问?