在ES6中分配变量的清洁方法

时间:2017-02-27 17:22:33

标签: javascript arrays object ecmascript-6

我有以下代码

 const lower = U => U.toLowerCase();

 const A = lower('A')
 const B = lower('B')
 const C = lower('C')
 const D = lower('D')
 ...

我如何表示这是一种更清洁的方式?保证传递给函数的变量名和参数是相同的。

我能想到的一个可能的解决方案是

const [ A, B, C, D ] = ['A', 'B', 'C', 'D'].map(lower)

有没有这种重复的解决方案吗?

2 个答案:

答案 0 :(得分:1)

您可以使用具有前变量名称的对象作为键。它易于维护和迭代。



const lower = U => U.toLowerCase(),
      object = {};

['A', 'B', 'C', 'D'].forEach(c => object[c] = lower(c));

console.log(object);




使用对象内的给定值



const lower = U => U.toLowerCase(),
      object = { A: 'A', B: 'B', C: 'C', D: 'D' };

Object.keys(object).forEach(k => object[k] = lower(object[k]));

console.log(object);




答案 1 :(得分:-1)

事实证明,这是一个很好的"对我来说有趣的问题,它帮助我理解JavaScript中更深层次的东西(尽管不完全)。好的长话短说,你可以做如下;



var f = String.prototype.toLowerCase,
    r = [];

r = ["A", "B", "C", "D"].map(f.call,f);
console.log(r);




我们在此提供this作为String.prototype.toLowerCase函数本身。然而,这是一个稍微(或不轻微)的棘手问题。

当您通过传递相同的参数尝试从.map()隔离的.map()的回调函数时,一切正常,如下所示;



var c = String.prototype.toLowerCase.call("A",0,["A", "B", "C", "D"]);
console.log(c); // <- "a";
&#13;
&#13;
&#13;

但是如果你在.map()中应用完全相同的函数,它将抛出一个&#34;未捕获的TypeError:undefined不是一个函数&#34;错误如下;

&#13;
&#13;
r = ["A", "B", "C", "D"].map(String.prototype.toLowerCase.call);
&#13;
&#13;
&#13;

嗯...似乎在.map()内,我们必须提供this作为String.prototype.toLowerCase函数对象本身。为什么这样..?老实说打败了我。可能有人可以帮忙...