JavaScript:函数创建数组作为返回对象的值

JavaScript:函数创建数组作为返回对象的值,javascript,Javascript,我正在创建一个函数,它接受数组和回调,并返回一个对象。它被设计为遍历数组并对每个元素执行回调。然后,回调的每个返回值都保存为对象上的键。与每个键关联的值将是一个数组,由传递到回调时产生该返回值的所有元素组成 function groupBy(array, callback) { let obj = {}; let newArr = []; //loop through each ele w/ callback //return value saved as key in obj

我正在创建一个函数,它接受数组和回调,并返回一个对象。它被设计为遍历数组并对每个元素执行回调。然后,回调的每个返回值都保存为对象上的键。与每个键关联的值将是一个数组,由传递到回调时产生该返回值的所有元素组成

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;
}
函数应该创建数组作为返回对象的值,但它没有。此外,如果传入时回调返回相同的值,则不会将数组项分组在一起

测试用例:


相反,我得到:{1:1,2:2}您的代码有不止一个问题

首先,您使用的是
obj[key]=callback(ele)
a命令,它将
key
分配给
object[key]

第二,您正在推入
newArr
数组,但从未使用它

下面的代码片段可能会对您有所帮助

函数groupBy(数组、回调){
设obj={};
//循环通过每个元素,包括回调
//返回值保存为obj obj中的键[key]=值
array.forEach(ele=>{
let key=回调(ele)
obj[key]=obj[key]| |[];
//^^^^^如果空数组不存在,请创建一个空数组
obj[键]。推送(ele)
});
返回obj;
}
常量小数=[1.3,2.1,2.4];
const floored=函数(num){
返回Math.floor(num);
};

console.log(groupBy(小数,floored));//应该记录:*{1:[1.3],2:[2.1,2.4]}**
您不应该重写密钥,而是应该获取数组并将其推送到数组中

函数groupBy(数组、回调){
设obj={};
设newArr=[];
//循环通过每个元素,包括回调
//返回值保存为obj obj中的键[key]=值
array.forEach(ele=>{
let key=回调(ele)
//obj[键]=键;
设newArr=obj[key];
if(newArr==未定义){
newArr=新数组();
}
新推力(ele);
obj[key]=newArr;
});
返回obj;
}
常量小数=[1.3,2.1,2.4];
const floored=函数(num){return Math.floor(num);};

日志(groupBy(小数,floored))
这类问题已经在javascript语言中创建,它是array.reduce()方法谢谢这非常有用。为什么我不应该使用obj[key]=callback(ele)赋值将key分配给object[key]?不客气。很高兴听到它对您有用:)
callback(ele)
返回存储实际值的键。例如,对于值
1.21
,它返回
1
。因此,您可以像
object[1]=1那样分配它,但您需要
object[1]。push(1.21)
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] }**
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)
    if (obj[key] === undefined) {
      obj[key] = [ele]
        } else {
        obj[key].push(ele);
        }  
    });
  return obj;
}