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

时间:2019-06-10 23:12:52

标签: javascript function object if-statement keyvaluepair

我的目标如下:

创建一个函数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语句。

2 个答案:

答案 0 :(得分:0)

这样做的时候

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] }

答案 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; }