为什么javascript对象没有map / reduce / filter?

时间:2016-10-03 14:15:32

标签: javascript functional-programming ecmascript-6

假设我有这个对象:

const millionsOfLines = {
    windowsVista: 50,
    firefox: 9,
    google: 2000,
    quake3Engine: 0.3,
    mySQL: 12
};

就像我可以做的那样,我会为数组做同样的事情:

const lessThan10 = millionsOfLines.filter((value, key)=> value < 10);

相反,我必须这样做:

const lessThan10 = {};
Object.keys(millionsOfLines).forEach(key=>{
    if (millionsOfLines[key] < 10) {
        lessThan10[key] = value;
    }
});

多么麻烦。其他功能肯定也可以与数组版本完全相同:

const thousandsOfLines = millionsOfLines.map((value, key)=> value * 1000);
const totalLines = millionsOfLines.reduce((total, currValue, currKey)=> total + currValue);

我计划将其与我实际需要输入的内容进行比较,但我无法忍受这种痛苦,所以这是留给读者的练习。

那么 - 为什么javascript对象没有map / reduce / filter?

2 个答案:

答案 0 :(得分:5)

回答实际问题:

他们尚未被提议,定义,检查以确保他们不会与其他事物发生冲突等等。您可以自由地在{{3}上提出建议。 }。我认为我们肯定会看到更多这类实用程序,因为人们正在严格定义语义,正如我们已经看到TC-39 github page一样。 (我认为我们会在SIGSEGVObject上将其视为其他方法,但不是Reflect的补充。在此阶段向Object.prototype添加内容是真的,真的很难保持网络安全。&#34;)

旁注:

  

相反,我必须这样做:

Object.prototype

嗯,我以为你想过滤对象属性:

&#13;
&#13;
const lessThan10 = Object.keys(millionsOfLines)
    .filter(key=> millionsOfLines[key] < 10)
    .map(key=> millionsOfLines[key]);
&#13;
&#13;
&#13;

只需要一次通过,而不是两次。

答案 1 :(得分:1)

我无法告诉你为什么物体没有这些功能。它可能是因为它们不是哈希表的对象,并且最初并不意味着像地图一样使用。在ES6中,您可以使用Maps代替,但所有主流浏览器都不支持此类型。

另外,如果您正在寻找这些函数,请查看Lodash广泛使用的库,其中实现了更高阶函数。该库具有支持map,reduce,filter,flatten以及许多其他数组和对象的函数。