如何在没有箭头功能的情况下编写此函数

时间:2017-08-09 09:47:15

标签: javascript function foreach functional-programming arrow-functions

已解决:我的对象值赋值应该是[1]而不是obj [1]

我正在用javascript练习一些函数式编程,我还没有完全理解使用箭头函数所以我试图避免使用。这是我的问题集的解决方案,但我需要帮助以我理解的方式编写它。

function transformEmployeeData(array){
  return array.map(a =>{ 
   var obj = {}; 
   a.forEach(a => obj[a[0]] = a[1]); 
   return obj;
 });

这是我重写函数但不编译的方式。任何人都可以帮我理解我的缺点吗?

function transformEmployeeData(array) {
  return array.map(function(x) {
  var obj = {};
  x.forEach(function(a){
    obj[a[0]] = obj[1];
    return obj;
  });
});
}

1 个答案:

答案 0 :(得分:0)

通过使它们成为命名函数,可以轻松省略箭头函数和匿名函数。这是我的建议:

function transformEmployeeData(arrayOfArray) {
  function transform(arr) {
    const map = {}; 
    function registerMap (arr) {
      map[arr[0]] = arr[1];
    }
    arr.forEach(registerMap);
    return obj;
  }
  return arrayOfArray.map(transform);
};

我们可以将命名函数重写为使用绑定到函数表达式:

const transformEmployeeData = function(arrayOfArray) {
  const transform = function (arr) {
    const map = {}; 
    const registerMap = function (arr) {
      map[arr[0]] = arr[1];
    }
    arr.forEach(registerMap);
    return obj;
  }
  return arrayOfArray.map(transform);
};

然后我们可以将其重写为箭头函数:

const transformEmployeeData = (arrayOfArray) => {
  const transform = (arr) =>  {
    const map = {}; 
    const registerMap = (arr) => {
      map[arr[0]] = arr[1];
    }
    arr.forEach(registerMap);
    return obj;
  }
  return arrayOfArray.map(transform);
};

然后我们可以用它的定义替换变量:

const transformEmployeeData = (arrayOfArray) => {
    return arrayOfArray.map((arr) => {
        const map = {};
        arr.forEach((arr) => {
            map[arr[0]] = arr[1];
        });
        return obj;
    });
};

当只有一个参数时,括号是可选的。如果正文是一个表达式,则可以省略curles。因此,我们可以删除可选语法:

const transformEmployeeData = arrayOfArray => 
    arrayOfArray.map(arr => {
        const map = {};
        arr.forEach(arr => {
            map[arr[0]] = arr[1];
        });
        return obj;
    });

像airbnb这样的编码风格表明如果我们有卷曲,我们就不会删除parenses,因此:

const transformEmployeeData = arrayOfArray =>
    arrayOfArray.map((arr) => {
        const map = {};
        arr.forEach((arr) => {
            map[arr[0]] = arr[1];
        });
        return obj;
    });

箭头功能不会绑定this所以这些只是因为我们没有使用this而相同。