Functional programming Immutable js-以声明方式从深度嵌套对象中提取值的最佳方法?

Functional programming Immutable js-以声明方式从深度嵌套对象中提取值的最佳方法?,functional-programming,immutable.js,Functional Programming,Immutable.js,假设我从一个API调用中得到一个json,解析后的形状如下: const foos = { foo1: { bar1: [{a:1},{a:2},{a:3}], bar2: [{a:4},{a:5},{a:6}], bar3: [{a:7},{a:8},{a:9}] }, foo2: { bar4: [{a:10},{a:11},{a:12}], bar5: [{a:13},{a:14},{a:15}] } } 然后,我将它包装在fromJ

假设我从一个API调用中得到一个json,解析后的形状如下:

const foos = {
  foo1: {
    bar1: [{a:1},{a:2},{a:3}],
   bar2: [{a:4},{a:5},{a:6}],
    bar3: [{a:7},{a:8},{a:9}]
  },
  foo2: {
    bar4: [{a:10},{a:11},{a:12}],
    bar5: [{a:13},{a:14},{a:15}]
  }
}
然后,我将它包装在
fromJs()
中,使其不可变

接下来,我需要迭代该对象,以这种方式提取值,并对其执行任何操作:

var obj = {aValue: 0}

Object.keys(foos).forEach( key => {    
  Object.keys(foos[key]).forEach( nestedKey => {
    foos[key][nestedKey].forEach(el => {
      obj.aValue = el.a
      console.log(obj)
    })    
  })
})
在控制台中:

{ aValue: 1 }
{ aValue: 2 }
{ aValue: 3 }
{ aValue: 4 }
{ aValue: 5 }
{ aValue: 6 }
{ aValue: 7 }
{ aValue: 8 }
{ aValue: 9 }
{ aValue: 10 }
{ aValue: 11 }
{ aValue: 12 }
{ aValue: 13 }
{ aValue: 14 }
{ aValue: 15 }
以声明方式处理不可变JS的最佳方法是什么?

您可以使用,它创建一个新的扁平集合

// flatten the first two levels
const foos =  Immutable.fromJS({...});
const flatCollection = foos.flatten(2);
flatCollection.forEach(val => console.log('flat entry', val.get('a')));
如果您只想在数据中爬行而不是创建集合,那么使用Immutable的
forEach
在层中爬行可能是更好(更快)的方法。这也可以与
.reduce

const foos=Immutable.fromJS({
foo1:{
bar1:[{a:1},{a:2},{a:3}],
bar2:[{a:4},{a:5},{a:6}],
bar3:[{a:7},{a:8},{a:9}]
},
食物2:{
bar4:[{a:10},{a:11},{a:12}],
bar5:[{a:13},{a:14},{a:15}]
}
});
//进入所有不可变集合并处理其值
函数deepLoop(值、键){
if(不可变的.isCollection(值)){
forEach值(deepLoop);
}否则{
console.log('原语条目'、键、值);
}
}
foos.forEach(deepLoop);
//进入所有地图并以不同方式处理列表
函数deepMap(值、键、上下文){
if(不可变的.Map.isMap(值)){
value.forEach(deepMap,key);
}否则{
value.forEach(val=>console.log('list entry',val.get('a'));
}
}
foos.forEach(deepMap)

对对象进行变异并将其反复记录到控制台并不完全起作用,或者以声明方式进行操作会带来好处。您的实际问题是什么,需要什么样的结果数据结构?我需要提取所有这些值,console.log只是一个示例。如果我告诉你我对这个值做了什么,我会说得过于领域化,所以我认为这无关紧要。代码远不是功能性的,但我希望以这种方式慢慢地迁移它。我更关心的是如何正确地使用不可变JS,但提取到什么?迭代器?阵列?一些immutable.js结构?如果有意义,我会用这个值填充另一个对象,就像在console.log中一样,期望其他值已经存在{prop1:…,prop2:…,aValue:1}。。。例如,对于Immutable,我可能会使用带有默认值的记录,并将此记录插入其中。谢谢,forEach的解决方案是可行的。如果我没有弄错的话,第一个使用flatte的函数实际上只是保留数组中最后一个“a”值。flatte不能很好地工作,因为它会合并具有相同名称的所有属性,除非您选择一个更高级别,例如
。flatte(2)最终得到完整对象的位置