Javascript 在redux中更新深层嵌套数组
我一直在四处寻找解决方案或指南来解决我的问题。。 我需要通过我随操作传递的ID找到正确的子文档,然后通过我随操作传递的ID找到正确的子文档 我从API获取对象,然后将其置于状态。 我所拥有的对象与此类似:Javascript 在redux中更新深层嵌套数组,javascript,reactjs,redux,Javascript,Reactjs,Redux,我一直在四处寻找解决方案或指南来解决我的问题。。 我需要通过我随操作传递的ID找到正确的子文档,然后通过我随操作传递的ID找到正确的子文档 我从API获取对象,然后将其置于状态。 我所拥有的对象与此类似: proj = { id:"zf123ada123ad", name:"examp", subdoc:{ name:"subdoc examp", subsubdoc:[{ id:"zcgsdf123zaar21",
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对象中循环它吗?它确实返回正确的对象,但我的问题是如何在嵌套的大对象中更新该对象:一旦你以任何方式找到正确的对象,只需更改属性。如果未克隆任何对象,则找到的对象将与嵌套数组中的对象相同。