Javascript 将函数应用于对象树中属性的所有实例

Javascript 将函数应用于对象树中属性的所有实例,javascript,node.js,functional-programming,Javascript,Node.js,Functional Programming,假设我有一个结构和深度未知的对象,我想修改一个属性。例如,假设我要更改的属性是id,结构可能如下所示: "{ "a": "foo", "b": "bar", "c": { "id": { "a": "foo" }, "b": "whatever" }, "id": { "a": "foo" } }" 是否有任何已建立的模式或方法在整个树中获取所需密钥的任何实例,并对其应用泛型函数?理想情况下,也要检查数组元素是否存在。在函数编

假设我有一个结构和深度未知的对象,我想修改一个属性。例如,假设我要更改的属性是
id
,结构可能如下所示:

"{
  "a": "foo",
  "b": "bar",
  "c": {
    "id": {
      "a": "foo"
    },
    "b": "whatever"
  },
  "id": {
    "a": "foo"
  }
}"

是否有任何已建立的模式或方法在整个树中获取所需密钥的任何实例,并对其应用泛型函数?理想情况下,也要检查数组元素是否存在。

在函数编程方面,我们需要我们的结构是一个函子,也就是说,为它提供一个函数
fmap
,这样
fmap(fn,someTree)
将产生与
fn
应用于其中所有值相同的结构。有很多方法可以实现这一点,例如:

让isObject=x=>x&&typeof x=='object';
设map=fn=>obj=>
数组.isArray(obj)
? 对象映射((v,k)=>fn([null,v]).pop())
:Object.fromEntries(Object.entries(obj.map)(fn));
让_fmap=fn=>([key,val])=>
等深线(val)
? [
钥匙
地图(_fmap(fn))(val)
]
:fn([key,val]);
设fmap=fn=>map(_fmap(fn));
//
常量重命名key=(o,n)=>([key,val])=>(key==o?[n,val]:[key,val]);
测试={
答:1,,
b:2,
c:[
{a:1},{a:2},{b:3}
]
};
newTest=fmap(重命名为“a”、“blah”)(测试);

console.log(newTest)是否要使用键
id
更改所有属性?你试过什么?回答者:注意标签!我错过了,结果贴出了一个无用的答案。@NinaScholz是的,这就是我想做的。我已经知道如何通过递归来实现,但我想知道是否有一种特定的模式可以以函数的方式实现这一点,以避免对象在被遍历时发生变异——我应该更清楚这一点,因为我在问题标签中只提到了函数编程。我在读有关镜头的文章,但它们似乎不适合我的使用情况。这可能就是我想要的!它几乎可以工作,但有一个问题:对于数组,它不是返回数组,而是返回一个带有数字键的对象。编辑:它还创建了一些额外的“0”:0属性,它不应该,我不知道为什么。仍然不存在。。。它正在创建一组带有索引值和中间数组的数组(很抱歉打扰您)@kace91:没问题。。。想修改一下你的测试数据吗?这看起来确实节省了数组!我看到的限制,除非我错了,是函数的范围一次只限于给定的键值,对吗?也就是说,如果我想一次执行涉及多个属性的操作,它将无法工作-例如“仅当对象的属性B具有特定值时才修改此数组的属性a”@kace91:没错,此函数仅调用原子(非对象)值的回调。