【发布时间】:2023-02-25 23:36:21
【问题描述】:
我发现自己经常使用这样的模式:
const objectArray = [
{ name: "Bob", value: 20 },
{ name: "Jane", value: 15 },
{ name: "John", value: 5 },
{ name: "Jane", value: 10 },
];
objectArray.reduce((result, nextValue) => {
if (!(nextValue.name in result)) result[nextValue.name] = 0;
result[nextValue.name] += nextValue.value;
return result;
}, {}); // { Bob: 20, Jane: 25, John: 5 }
IE。我使用对象中的一些键和值以及一个 reduce 函数(在上面的示例中为 +,但可以是任何东西)将一个对象数组缩减为一个键值对字典。重要的是,如果键尚不存在,则必须用一些值对其进行初始化。
我想知道,任何人都知道一些优雅的方法可以使它更具功能性,即抽象出命令式if 语句以检查密钥是否存在和变异语句,同时仍然保持它在Array.prototype.reduce() 中可用。
【问题讨论】:
-
如果你的意思是只让它成为一行,你可以只使用 nullish 合并,但它不会让它更“实用”
const result = objectArray.reduce((result, nextValue) => ((result[nextValue.name] = result[nextValue.name] ?? 0 + nextValue.value),result),{});为了让它更实用,你可以将分组逻辑抽象为一个通用状态,该状态接受封装了细节。 -
不。其他语言 have data structures that solve this problem 或 solve it with a missing default property procedure 但 JS 中没有“更好”的解决方案。您可以使用 Proxy 拦截对象属性访问并返回 0,但我不推荐这样做:增加的复杂性(和代理不能被填充)只是不值得。
-
你能更详细地谈谈你认为抽象应该采用什么形式吗?无论您如何处理,您仍然需要检查属性键是否存在,并且您仍然需要进行一些添加。
标签: javascript functional-programming