Javascript 在redux中更新深层嵌套数组

Javascript 在redux中更新深层嵌套数组,javascript,reactjs,redux,Javascript,Reactjs,Redux,我一直在四处寻找解决方案或指南来解决我的问题。。 我需要通过我随操作传递的ID找到正确的子文档,然后通过我随操作传递的ID找到正确的子文档 我从API获取对象,然后将其置于状态。 我所拥有的对象与此类似: proj = { id:"zf123ada123ad", name:"examp", subdoc:{ name:"subdoc examp", subsubdoc:[{ id:"zcgsdf123zaar21",

我一直在四处寻找解决方案或指南来解决我的问题。。 我需要通过我随操作传递的ID找到正确的子文档,然后通过我随操作传递的ID找到正确的子文档

我从API获取对象,然后将其置于状态。 我所拥有的对象与此类似:

proj = {
  id:"zf123ada123ad",
  name:"examp",
  subdoc:{
    name:"subdoc examp",
    subsubdoc:[{
               id:"zcgsdf123zaar21",
               subsubsubdoc:[{
                             id:"af2317bh123",
                             value: "heyhey"   //this value I want to update
                            }]
              }]
}
}
在我的减速机里,我有一个类似自动取款机的东西: 我知道这不起作用,因为我没有得到数组中的特定对象,但这就是我不知道如何做的。我有要更改其值的子文档的id

export function answerUpdate(state = [], action){
  switch(action.type){
    case 'ANSWER_UPDATE_FETCH_SUCCESS':
      return {
        ...state,
        proj: {
          ...state.proj,
          subdoc: {
            ...state.proj.subdoc,
            subsubdoc: {
                ...state.proj.subdoc.subsubdoc,
                subsubsubdoc: {
                    ...state.proj.subdoc.subsubdoc.subsubsubdoc,
                value: "hoy"
                }
            }
          }
        }
    default:
      return state
  }
}
我想要的是,这是减速器内部的一个有效且可接受的代码:

state.doc.subdoc.subsubdoc.where(x => x.id ==theInputId1)
   .subsubsubdoc.where(
   x => x.id == theInputId2).value = theInputValue

非常感谢您的每一个回答

假设action.payload是您的Id,您应该执行以下操作

    case 'ANSWER_UPDATE_FETCH_SUCCESS': {
            const index = state.proj.subdoc.subsubdoc.findIndex(({id}) => id === action.payload);
            const updatedObject = {
               ...state.proj.subdoc.subsubdoc[index],
               value: newValue
            }

            return {
               ...state,
               proj: {
                 ...state.proj,
                 subdoc: {
                   ...state.proj.subdoc,
                   subsubdoc: [
                        ...state.proj.subdoc.subsubdoc.slice(0, index),
                        updatedObject,
                        ...state.proj.subdoc.subsubdoc.slice(index)
                      ]
                    }
                  }
            }
    }
您可以在id不存在时进行额外检查,通过将state.proj.subdoc.subdoc存储在变量中来减少state.proj.subdoc.subdoc的使用,从而简化检查


建议不要在redux存储中进行如此深入的嵌套。

我首先关心的是将数据转换为常规格式。如果您无法控制API,请在收到API后尝试自己制作格式。这将为您节省大量复杂的代码。智能数据结构和哑程序代码通常比louzy数据结构和大量复杂代码表现得更好

var项目=[
{“id”:“zf123ada123ad”,
“名称”:“examp”,
“值”:空,
“文件”:[
{“id”:“zcgsdf123zaar21”,
“名称”:“examp sub”,
“值”:空,
“文件”:[
{“id”:“af2317bh123”,
“名称”:“examp sub sub”,
“价值”:“heyhey”,
“文件”:[]
}
]
}
]
}
];
//第一个选项:重复搜索。
变量搜索=函数(id){
var search_level=函数(结果,下一步){
if(result)返回结果;
否则{
if(next.id==id)返回next;
否则返回next.docs.reduce(search_level,null);
}
};
返回搜索级别;
};
var heyhey_search=project.reduce(search(“af2317bh123”),null;
log('option 1:');
控制台日志(heyhey_搜索);
//第二种选择:制作一个哈希表。如果您需要经常按id访问记录,则首选此选项。
var flatten_hash=函数(结果,下一个){
//拥有。
结果[next.id]=next;
//嵌套文档。
返回next.docs.reduce(展平散列,结果);
};
var project_hash=project.reduce(展平_hash,{});
var heyhey_hash=项目_hash[“af2317bh123”];
log('option 2:');

console.log(heyhey_散列)如果没有合理的索引,则使用与其他方法相同的方法进行迭代。可以详细说明吗?:)?您有一些问题需要解决。如果
proj
也是一个数组,而不是一个对象,并且子文档中的键是相同的,因此
subdoc
无处不在,而不是级别2中的subsubdoc`etc,那么您可以递归地执行此操作。但是如果你需要经常引用一个特定的文档,只需将数组展平成一个对象,这样你就可以直接访问任何对象,同时保持proj作为树。是的,但我不知道如何在redux reducer中执行,以及如何返回正确的内容等等,这让我感到困惑。嗯,这看起来像是什么,我的问题是,有效负载包含三个内容:subsubdoc的id、subsubdoc的id以及subsubdoc应该更改为的值。所以我首先需要找到正确的子文档,然后在其中找到正确的子文档,然后更改它的值。另外,我也不知道该怎么做,因为我正在从API收集数据进行更新,然后将其传递回数据库中更新数据。首先查找子文档,然后更新子文档,然后再更新子文档。请尽量避免这么多层次的嵌套。为每个减速器制作单独的减速器,然后在APIC中进行更新时将它们组合起来,这将如何工作?API正在向我发送此对象,我应该如何接收它?或者我应该更改API中的代码吗?你能用代码创建一个codesandbox并将其添加到问题中以便更好地帮助解决问题吗?数据并不是那么简单,每个文档都有其独特的不同类型的属性,在减速器中如何工作?最简单的方法是为每种类型的文档的属性创建一个模型。所以,根据文档类型,您有一个正确属性的数组。您还可以内联检测每个文档上有哪些属性,但这将需要大量代码。您应该要求数据库管理员更改其数据库,以便至少有一致的属性名称,并且只有值不同,因为当前的数据库结构使从后端到前端的一切都变得复杂,没有任何明显的优势。但是由于您控制API,你不能创建另一个服务,使用mongo搜索功能返回正确的记录,而不是尝试从proj对象中循环它吗?它确实返回正确的对象,但我的问题是如何在嵌套的大对象中更新该对象:一旦你以任何方式找到正确的对象,只需更改属性。如果未克隆任何对象,则找到的对象将与嵌套数组中的对象相同。