JavaScript:使用回调函数创建返回其键与值数组中的元素匹配的对象的函数

时间:2019-06-10 21:15:42

标签: javascript function loops callback arguments

我的目标如下:

构造一个函数multiMap,该函数将接受两个数组-一个值数组和一个回调数组。 multiMap将返回一个对象,其键与值数组中的元素匹配。分配给键的相应值将是由回调数组的输出组成的数组,其中每个回调的输入就是键。

我尝试了以下代码:

const multiMap = (arrOne, arrTwo) => {

  let newObj = {}; 

  for (let i=0; i<arrOne.length; i++){
    let element = arrOne[i]; 

    console.log(i)

    newObj[element] = arrTwo[i](element); 
  }
  return newObj; 
}



// Uncomment these to check your work!
function uppercaser(str) { return str.toUpperCase(); }
function capitalize(str) { return str[0].toUpperCase() + str.slice(1).toLowerCase(); }
function repeater(str) { return str + str; }

// arrOne
const items = ['catfood', 'glue', 'beer'];
// arrTwo
const functions = [uppercaser, capitalize, repeater];


console.log(multiMap(items, functions));

我的代码返回:{ catfood: 'CATFOOD', glue: 'Glue', beer: 'beerbeer' }

我希望它返回:{ catfood: ['CATFOOD', 'Catfood', 'catfoodcatfood'], glue: ['GLUE', 'Glue', 'glueglue'], beer: ['BEER', 'Beer', 'beerbeer'] }, 'Beer', 'beerbeer'] }

我在做什么错?

注意:我知道我可以使用修改功能(即reduce)来做到这一点,但我想先使用for循环来弄清楚。

2 个答案:

答案 0 :(得分:0)

问题是您仅在第一个数组上循环。您必须遍历数组1中每个值的所有功能。

const multiMap = (arrOne, arrTwo) => {

  let newObj = {}; 

  for (let i=0; i<arrOne.length; i++){
    let element = arrOne[i];
    newObj[element] = [];
    for(let j=0;j < arrTwo.length; j++) {
     
    newObj[element].push(arrTwo[j](element)); 
    }
  }
  return newObj; 
}



// Uncomment these to check your work!
function uppercaser(str) { return str.toUpperCase(); }
function capitalize(str) { return str[0].toUpperCase() + str.slice(1).toLowerCase(); }
function repeater(str) { return str + str; }

// arrOne
const items = ['catfood', 'glue', 'beer'];
// arrTwo
const functions = [uppercaser, capitalize, repeater];


console.log(multiMap(items, functions));

答案 1 :(得分:0)

您必须遍历函数数组才能创建关联的结果数组。

const multiMap = (arrOne, arrTwo) => {

  let newObj = {}; 

  for (let i=0; i<arrOne.length; i++){
    let element = arrOne[i]; 

    console.log(i)

    var arr = [];
    for (let f=0;f<functions.length;f++) {
      arr.push(functions[f](element));
    }

    newObj[element] = arr; 
  }
  return newObj; 
}



// Uncomment these to check your work!
function uppercaser(str) { return str.toUpperCase(); }
function capitalize(str) { return str[0].toUpperCase() + str.slice(1).toLowerCase(); }
function repeater(str) { return str + str; }

// arrOne
const items = ['catfood', 'glue', 'beer'];
// arrTwo
const functions = [uppercaser, capitalize, repeater];


console.log(multiMap(items, functions));