是否有对象的`.map`之类的函数?用相同的键创建一个新对象

问题描述 投票:1回答:3

对于数组,我们可以使用.map方法创建具有相同数组结构(即,元素数量相同)的新地图。

例如

const array = [2, 4, 6]; 
const newArray = array.map(v => v *2); //[4, 8, 12]; 

我相信在函数式编程中,这使数组对象成为所谓的functor

对于对象,我想做类似的事情-我想创建一个具有与原始对象相同的结构(相同的键)以及相同的功能等的新对象。

例如

const obj = {
    foo: 2, 
    bar: 4, 
    biz: 6
}; 

const newObj = obj.map(v => v *2); // {foo: 4, bar: 8, biz: 12}

我当前执行此操作的方式是使用Object.entries.reduce

const obj = {
    foo: 2, 
    bar: 4, 
    biz: 6
}; 

const newObj = Object.entries(obj).reduce((acc,cur) => {
    return {
        ...acc, 
        [cur[0]]: cur[1] * 2
    }
}, {}); 

console.log(newObj); 

我想知道-当前是否存在对象方法,该方法可以让我执行我丢失的操作?还是提议增加一个?

javascript functional-programming functor
3个回答
3
投票

[没有对象的本机映射,但是可以轻松创建一个。我认为条目是最简单的。

const obj = {
  foo: 2,
  bar: 4,
  biz: 6
}

const objMap = (obj, fn) =>
  Object.fromEntries(
    Object.entries(obj).map(fn)
  )

console.log(
  objMap(obj, ([k, v]) => [k, v * 2])
)

0
投票

使用.reduce()的另一种方法是这样的,利用解构来读取内容要容易一些(我认为)

const obj = {
    foo: 2, 
    bar: 4, 
    biz: 6
}; 

const newObj = Object.entries(obj).reduce((acc, [key, value]) => {
  acc[key] = value * 2;
  return acc;
}, {});

console.log(newObj)

0
投票

一种方法:

const obj = {
    foo: 2, 
    bar: 4, 
    biz: 6
}; 

const x = Object.keys(obj).map(o => {
	return {[o]: obj[o] * 2}
})

console.log(JSON.stringify(x, null, 2))
© www.soinside.com 2019 - 2024. All rights reserved.