Javascript 将对象中的所有关键帧转换为新对象

Javascript 将对象中的所有关键帧转换为新对象,javascript,object,Javascript,Object,假设我有一个类似的对象: const obj = { key1: 'ajklwenrvadva', key2: 'bgqo420v232', key3: '3ou4hfv34hc' // ... } 其中,密钥的每个值都是正在接收的加密字符串 我最近遇到了一个问题,我觉得应该有一种方法来迭代对象中的所有密钥,转换值,在这种情况下解密,然后插入到一个新对象中 我目前使用的解决方案是执行如下循环: const newObj = {} for (const key of Object

假设我有一个类似的对象:

const obj = {
  key1: 'ajklwenrvadva',
  key2: 'bgqo420v232',
  key3: '3ou4hfv34hc'
  // ...
}
其中,密钥的每个值都是正在接收的加密字符串

我最近遇到了一个问题,我觉得应该有一种方法来迭代对象中的所有密钥,转换值,在这种情况下解密,然后插入到一个新对象中

我目前使用的解决方案是执行如下循环:

const newObj = {}
for (const key of Object.keys(obj)) newObj[key] = decrypt(obj[key])
这很好,但出于我自己的好奇心和理智,有没有一种方法可以使用reduce或类似的方法来做同样的事情


是的,这不是纯JS,但仍然可能有用。

这一点也不不不合理,但据我所知,标准JavaScript库中没有类似map for Object的东西

您将看到人们因以下原因而减少虐待:

const newObj = Object.keys(obj).reduce((newObj, key) => {
    newObj[key] = decrypt(obj[key]);
    return newObj;
}, {});
…也可以使用逗号运算符编写:

const newObj = Object.keys(obj).reduce((newObj, key) => (newObj[key] = decrypt(obj[key]), newObj), {});
…但坦率地说,我从来都不喜欢它,尤其是因为它很容易忘记从迭代器返回newObj,得到错误,然后返回并添加它。对我来说,如果累加器没有改变,reduce是错误的答案,在上面的例子中,传递的对象引用永远不会改变。我只是像你一样使用或使用:


或者在某些项目中,如果我发现自己在重复它,一个实用程序函数就可以做到这一点。

我可能会使用reduce来实现这一点:

const obj = {hello: "World", goodbye: "Universe"};
const newObj = Object.keys(obj).reduce((o, k) => {
  o[k] = obj[k].toUpperCase();
  return o;
}, {});
ES2017提供了一种方法,该方法返回给定对象自身可枚举属性[key,value]对的数组,其顺序与for…in循环提供的顺序相同

我们也可以通过以下方式实现:

const obj = {
  key1: 'ajklwenrvadva',
  key2: 'bgqo420v232',
  key3: '3ou4hfv34hc'
}
let newObj = {};

Object.entries(obj).forEach(([key, value]) => newObj[key] = decrypt(value));

有没有什么方法可以在没有任何依赖项的情况下做同样的事情?@m_callens没有那么优雅,否则lodash就不会有它。我不喜欢reduce变量,因为它是有状态的,并且有点破坏了reduce所暗示的FP样式。Oops:修复了上面累加器和键的顺序。如果它向后看,点击刷新。@Andrey:是的,没错。
const obj = {hello: "World", goodbye: "Universe"};
const newObj = Object.keys(obj).reduce((o, k) => {
  o[k] = obj[k].toUpperCase();
  return o;
}, {});
const obj = {
  key1: 'ajklwenrvadva',
  key2: 'bgqo420v232',
  key3: '3ou4hfv34hc'
}
let newObj = {};

Object.entries(obj).forEach(([key, value]) => newObj[key] = decrypt(value));