Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环到嵌套数组并修改数据_Javascript_Arrays_Multidimensional Array - Fatal编程技术网

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