假设我有这样一个对象:
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
一样。(我认为我们将主要将它们视为Object
和Reflect
的附加方法,而不是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和许多其他数组和对象。