【问题标题】:How to turn an array of functions to an object with keys as functions' name and values as functions' return values如何将一个函数数组转换为一个对象,其中键作为函数的名称,值作为函数的返回值
【发布时间】:2018-02-05 01:47:59
【问题描述】:

如何将一个函数数组添加到一个对象中,其中键作为函数的名称,值作为函数的返回值。一个例子是:

 var a=x=>"M",b=_=>"e",c=_=>"r",d=_=>"y",e=_=>"C",
     f=_=>"h",g=_=>"i",h=_=>"s",i=_=>"t",j=_=>"m",
     k=_=>"a",l=_=>" ",m=_=>"!",
     funcs = [a,b,c,d,e,f,g,h,i,j,k,l,m]

 // do some magic with funcs to receive myDict     
 var myDict = {'a':'M', 'b':'e', 'c':'r', 'd':'y', ...}

我尝试了类似的方法,但没有成功。

var dict = funcs.reduce(function (acc, func) {
    acc[func.name] = func();
    return acc;
}, {});

我该如何解决这个问题以达到想要的结果?不使用reduce有更好的吗?

【问题讨论】:

  • acc[func.name] = func(); 调用函数;你只想要acc[func.name] = func;

标签: javascript function object dictionary reduce


【解决方案1】:

遍历函数数组funcs,使用funcs[i].name获取函数的名称,并通过funcs[i]()返回该函数的值。

将名称存储为键,并将返回值存储为对象中该键的值。

var a=x=>"M",b=_=>"e",c=_=>"r",d=_=>"y",e=_=>"C",
    f=_=>"h",g=_=>"i",h=_=>"s",i=_=>"t",j=_=>"m",
    k=_=>"a",l=_=>" ",m=_=>"!";

var funcs = [a,b,c,d,e,f,g,h,i,j,k,l,m];

var dict = (function (funcs) {
    var dict = {};
    for(var i=0; i<funcs.length; i++){
    	var name = funcs[i].name;
    	var ret = funcs[i]();
      dict[name] = ret;
    }
    return dict;
})(funcs);

console.log(dict);

【讨论】:

    【解决方案2】:

    你可以做这样的事情,而不是减少,

    var dict = {}
    funcs.forEach(function (func) {
      dict[func.name] = func();
    });
    

    还有小提琴:https://jsfiddle.net/jperelli/0tpj88ab/

    【讨论】:

      【解决方案3】:

      我只是很傻,忘记在函数末尾返回一个值。所以我提出的从一开始就减少的解决方案实际上是正确的。

      var dict = funcs.reduce(function (acc, func) {
          acc[func.name] = func();
          return acc;
      }, {});
      

      【讨论】:

        【解决方案4】:

        您可以使用Object.assignArray#map 的组合。

        var a = x => "M", b = _ => "e", c = _ => "r", d = _ => "y", e = _ => "C", f = _ => "h", g = _ => "i", h = _ => "s", i = _ => "t", j = _ => "m", k = _ => "a", l = _ => " ", m = _ => "!",
            funcs = [a, b, c, d, e, f, g, h, i, j, k, l, m],
            myDict = Object.assign(...funcs.map(f => ({ [f.name]: f() })));
        
        console.log(myDict);
        .as-console-wrapper { max-height: 100% !important; top: 0; }

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-10
          • 1970-01-01
          • 2020-10-04
          • 2018-07-30
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多