假设我有一个类似于:
的对象const obj = {
key1: 'ajklwenrvadva',
key2: 'bgqo420v232',
key3: '3ou4hfv34hc'
// ...
}
其中键的每个值都是正在接收的加密字符串。
我最近遇到了一个问题,我觉得应该有一个迭代对象中所有键的方法,转换值(在这种情况下解密),然后插入到一个新对象中。
我目前使用的解决方案是做一个循环:
const newObj = {}
for (const key of Object.keys(obj)) newObj[key] = decrypt(obj[key])
工作得非常好,但是出于我自己的好奇心和理智,是否有一种方法可以使用reduce
或类似的方法来做同样的事情?
答案 0 :(得分:2)
答案 1 :(得分:1)
根本不合理,但就我所知,标准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
是错误的答案,并且在上面传递的对象引用永远不会改变。)我只是使用{{ 1}}(正如您所做)或for-of
:
forEach
(或者在某些项目中,如果我发现自己重复它,就会发挥作用。)
答案 2 :(得分:0)
我可能会使用reduce来实现这个目标:
const obj = {hello: "World", goodbye: "Universe"};
const newObj = Object.keys(obj).reduce((o, k) => {
o[k] = obj[k].toUpperCase();
return o;
}, {});
答案 3 :(得分:0)
ES2017提供了一个方法Object.entries(),它返回给定对象自己的可枚举属性[key,value]对的数组,其顺序与for...in
循环提供的顺序相同
我们也可以通过以下方式实现它:
const obj = {
key1: 'ajklwenrvadva',
key2: 'bgqo420v232',
key3: '3ou4hfv34hc'
}
let newObj = {};
Object.entries(obj).forEach(([key, value]) => newObj[key] = decrypt(value));