Javascript 循环到嵌套数组并修改数据
根据上述结构,所有类型都具有Javascript 循环到嵌套数组并修改数据,javascript,arrays,multidimensional-array,Javascript,Arrays,Multidimensional Array,根据上述结构,所有类型都具有text-1 我只希望第一次出现在text-1中,其余的都应该是数据结构中的text-2 块的顺序不应改变。此外,块可以有不同的类型,不应受到影响 我试图循环每个块,但没有逻辑来修改第一次出现的内容。请帮忙 以下是我到目前为止所做的尝试 let newData = data.forEach(data => { return data.block.forEach(block => { return block.child.forEach((typ
text-1
我只希望第一次出现在text-1
中,其余的都应该是数据结构中的text-2
块的顺序不应改变。此外,块可以有不同的类型,不应受到影响
我试图循环每个块,但没有逻辑来修改第一次出现的内容。请帮忙
以下是我到目前为止所做的尝试
let newData = data.forEach(data => {
return data.block.forEach(block => {
return block.child.forEach((type, i) => {
if (i === 0) { return }
type.type = 'text-2'
})
});
});
当前数据
const data = [
{
block: [
{ child: [{ type: 'text-1' }] },
{ child: [{ type: 'any type' }] },
{ child: [{ type: 'text-1' }] }
]
},
{
block: [
{ child: [{ type: 'text-1' }] },
{ child: [{ type: 'text-1' }] }
]
}
]
预期数据,
const data = [
{
block: [
{ child: [{ type: 'text-1' }] },
{ child: [{ type: 'any type' }] },
{ child: [{ type: 'text-2' }] }
]
},
{
block: [
{ child: [{ type: 'text-2' }] },
{ child: [{ type: 'text-2' }] }
]
}
]
通过使用一个函数一次性获取第一个字符串,并为所有其他调用获取另一个字符串,还可以映射项和嵌套项
const
getOnce=(第一个,其他,已使用)=>()=>已使用?其他:(使用=正确,第一);
数据=[{block:[{child:[{type:'text-1'}]},{child:[{type:'any type'}]},{child:[{type:'text-1'}]}]},{block:[{child:[{type:'text-1'}]}]},{child:[{type:'text-1'}]}]},
type1='text-1',
type2='text-2',
getType=getOnce(类型1,类型2),
结果=data.map(
({block})=>({
block:block.map(
({child})=>({
child:child.map(o=>Object.assign({},o,o.type===type1&&{type:getType()}))
})
)
})
);
控制台日志(结果)代码>
.as控制台包装{最大高度:100%!重要;顶部:0;}
假设:
- 数组结构如示例所示
- 每个
数据元素都是一个对象。
- 每个对象都有一个块属性,它是一个数组
- 每个块元素可能都有一个类型属性
- 您希望更改原始数组而不制作新的副本(这是我从问题中理解的,但我当然可能是错的)
下面是一个(丑陋的)解决方案,可以根据需要更改值
作为一个侧面的注释,这种改变是奇怪的,似乎并没有太大的意义,我强>高度< /强>建议您考虑使用替代的数据结构。< /P>
代码解释直接在下面的代码中
const数据=[
{
区块:[
{child:[{type:'text-1'}]},
{child:[{type:'任何类型'}]},
{child:[{type:'text-1'}]}
]
},
{
区块:[
{child:[{type:'text-1'}]},
{child:[{type:'text-1'}]}
]
}
];
//那是不合理的。。无论如何
data.forEach((o,i)=>{
//循环每个元素,跟踪索引。
如果(i>0){
//如果不是第一个元素,则获取所有实际有子元素的元素,循环子元素,并将每个类型属性的1替换为2。
o、 block.forEach(c=>c.child&&c.child.forEach(child=>child.type=child.type.replace(“1”、“2”));
}
否则{
//否则,如果这是第一个元素,只需找到具有子元素且其子元素等于“text-1”的最后一个块。
常量elems=o.block.filter(c=>c.child&&c.child.length&&c.child.some(child=>child.type===“text-1”);
const found=elems&&elems.length&&elems[elems.length-1];
//如果找到,则替换该值。
如果(已找到)找到.child[0]。type=found.child[0]。type.replace(“1”、“2”);
}
});
控制台日志(数据)代码>通用替代方案,使用:
var-found=0,data=[{block:[{child:[{type:'text-1'}]},{child:[{type:'any type'}]},{child:[{type:'text-1'}]},{block:[{child:[{type:'text-1'}]}]},{child:[{type:'text-1'}]}]
data=JSON.parse(JSON.stringify(data),
(key,val)=>key='type'&&val='text-1'&&found++?'text-2':val)
console.log(data)
对我来说,转换背后的逻辑似乎不太合理。是的,我知道,但这正是所需要的:|@user007好的,那么请您至少向我们展示一下您为实现这一目标所做的努力?这个问题听起来像“请为我做那件事”,这也不太合理;)对不起,我已经更新了代码。我想,为什么要发布不起作用的代码呢?像往常一样,数组运算符的使用非常漂亮。我只是想知道OP是想要一个新的阵列,还是想要改变原来的阵列。@nina-你的解决方案工作得很好,但只有一个问题。我的数据结构在根级别也会有其他项目,比如元数据
,搜索引擎优化
,现在它只返回内容
部分。请检查此stackBlitz链接。请您帮助我返回完整的结果,并将您的逻辑放在适当的位置。为什么不将结果分配回data.data.content
?