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



假设我有这样一个对象:

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?

回答实际问题:

它们只是没有被提出、定义、检查以确保它们不与其他事物冲突,等等。你可以在TC-39 github页面上提出一些建议。我认为,随着人们严格定义语义,我们肯定会看到更多这类实用程序,就像我们在ES2017中看到的Object.values一样。(我认为我们将主要将它们视为ObjectReflect的附加方法,而不是Object.prototype的添加。在这个阶段给Object.prototype添加东西真的,真的很难保持"网络安全"。)


注:

相反,我必须这样做:

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

嗯,我假设你想过滤对象属性:

const millionsOfLines = {
    windowsVista: 50,
    firefox: 9,
    google: 2000,
    quake3Engine: 0.3,
    mySQL: 12
};
const lessThan10 = Object.keys(millionsOfLines).reduce((obj, k) => {
    let v = millionsOfLines[k];
    if (v < 10) {
        obj[k] = v;
    }
    return obj;
}, {});
console.log(lessThan10);

我不能告诉你为什么对象没有这些函数。这可能是因为它们是对象而不是哈希表,并且最初并不打算像映射那样使用。在ES6中,你可以使用Maps,但是这种类型并不是所有主流浏览器都支持的。

此外,如果您正在寻找这些函数,请查看Lodash,这是一个广泛使用的库,实现了高阶函数。这个库的函数支持map, reduce, filter, flatten和许多其他数组和对象。

最新更新