首页 > 解决方案 > 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 ] }

标签: javascript

解决方案


您的代码存在不止 1 个问题。

首先,您正在使用obj[key] = callback(ele)分配keyobject[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));


推荐阅读