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

时间:2018-01-10 16:00:49

标签: javascript object

假设我有一个类似于:

的对象
const obj = {
  key1: 'ajklwenrvadva',
  key2: 'bgqo420v232',
  key3: '3ou4hfv34hc'
  // ...
}

其中键的每个值都是正在接收的加密字符串。

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

我目前使用的解决方案是做一个循环:

const newObj = {}
for (const key of Object.keys(obj)) newObj[key] = decrypt(obj[key])

工作得非常好,但是出于我自己的好奇心和理智,是否有一种方法可以使用reduce或类似的方法来做同样的事情?

4 个答案:

答案 0 :(得分:2)

Lodash has something like that:

const newObj = _.mapValues(obj, decrypt);

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

答案 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));