假设我有一个类似于以下内容的对象:
const obj = {
key1: 'ajklwenrvadva',
key2: 'bgqo420v232',
key3: '3ou4hfv34hc'
// ...
}
其中 key 的每个值都是正在接收的加密字符串。
我最近遇到了一个问题,我觉得应该有一种方法来迭代对象中的所有键,转换值(在本例中解密),然后插入到新对象中。
我当前使用的解决方案是执行如下循环:
const newObj = {}
for (const key of Object.keys(obj)) newObj[key] = decrypt(obj[key])
它工作得很好,但是出于我自己的好奇心和理智,有没有一种方法可以使用 reduce
或类似的方法来完成同样的事情?
最佳答案
这完全没有道理,但据我所知,标准 JavaScript 库中没有像 map
这样的对象。
您会看到人们(ab)使用 reduce
来实现此目的:
const newObj = Object.keys(obj).reduce((newObj, key) => {
newObj[key] = decrypt(obj[key]);
return newObj;
}, {});
...也可以使用逗号运算符编写 (ab):
const newObj = Object.keys(obj).reduce((newObj, key) => (newObj[key] = decrypt(obj[key]), newObj), {});
...但坦率地说,我从来不喜欢它,尤其是因为很容易忘记从迭代器返回 newObj
,得到错误,并且必须返回并添加它。 (对我来说,如果“累加器”没有改变,reduce
是错误的答案,并且在上面传递的对象引用永远不会改变。)我只是使用for-of
(正如您所做的那样)或 forEach
:
const newObj = {};
Object.keys(obj).forEach(key => {
newObj[key] = decrypt(obj[key]);
});
(或者在某些项目中,如果我发现自己在重复它,则可以使用一个实用函数来实现它。)
关于javascript - 将对象中的所有键转换为新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48191409/