Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.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_Nested - Fatal编程技术网

Javascript 遍历嵌套对象并修改特定属性

Javascript 遍历嵌套对象并修改特定属性,javascript,arrays,nested,Javascript,Arrays,Nested,我有一个嵌套对象,如下所示: 我想要的只是一个递归函数,它遍历这个对象并为“id”属性分配一个随机值 let data = [{ id: 1, name: '', children: [{ id: 11, name: '', children: [] }, { id: 12, name: '', children: [{ id: 121, name: '', children: [] }, { id: 122, name: '', children: [] }] } ] }, { id: 2,

我有一个嵌套对象,如下所示:

我想要的只是一个递归函数,它遍历这个对象并为“id”属性分配一个随机值

 let data = [{ id: 1, name: '', children: [{ id: 11, name: '', children: [] }, { id: 12, name: '', children: [{ id: 121, name: '', children: [] }, { id: 122, name: '', children: [] }] } ] }, { id: 2, name: '', children: [{ id: 21, name: '', children: [] }, { id: 22, name: '', children: [{ id: 221, name: '', children: [] }, { id: 222, name: '', children: [] }] } ] } ];
这是我试过的代码,我把它修好了

const cloneNodesWithNewIds = (tree) => {
  const result = tree.map((elem) =>
    elem.children ? {
      ...elem,
      id: Math.floor((1 + Math.random()) * 0x10000)
        .toString(16)
        .substring(1),
      children: cloneNodesWithNewIds(elem.children),
    } :
    elem
  );
  return result;
}

console.log(cloneNodesWithNewIds(data))

谢谢大家

诸如此类的东西应该可以满足你们的需要

let data=[{id:1,名称:'',子项:[{id:11,名称:'',子项:[{id:12,名称:'',子项:[{id:121,名称:'',子项:[]},{id:122,名称:'',子项:[{id:21,名称:'',子项:[]},{id:22,名称:'',子项:[{id:221名称:'',子项:[]},{id:222,名称:“”,子项:[]}]}];
函数recursiveEdition(对象、标签、值){
//如果我们认为物体不是物体,那就没什么可做的了
if(对象类型!==“对象”){
回来
}
//我们检查对象的每个属性
Object.keys(Object.forEach)((索引)=>{
如果(索引===标签){
//如果它是所需的索引,我们将更改该值
对象[索引]=值;
}否则{
如果不是所需的索引,我们将继续导航
递归版本(对象[索引]、标签、值);
} 
});
回波信号
}
也许这会更快

let data=[{id:1,名称:'',子项:[{id:11,名称:'',子项:[{id:12,名称:'',子项:[{id:121,名称:'',子项:[]},{id:122,名称:'',子项:[{id:21,名称:'',子项:[]},{id:22,名称:'',子项:[{id:221名称:'',子项:[]},{id:222,名称:“”,子项:[]}]}];
常数maxVal=300;
设rndArr=[]
const getRdn=()=>{let rnd=Math.ceil(Math.random()*maxVal);while(rndArr.includes(rnd))rnd=Math.ceil(Math.random()*maxVal);rndArr.push(rnd);return rnd;};//唯一。如果不需要,可以简化
data=JSON.parse(
JSON.stringify(数据)
.replace(/“id”:\d+/g,match=>“id”:${getRdn()}`)
)

console.log(data)
这里是递归方法。如果obj是数组类型,则调用
forEach

const random=()=>Math.floor(Math.random()*1000)
const updateAttr=(项)=>{
if(阵列isArray(项目)){
项目.forEach(更新交易记录);
}否则{
item.id=random();
updateAttr(项目子项);
}
}  
常数数据=[
{
id:1,
姓名:“,
儿童:[
{
id:11,
姓名:“,
儿童:[],
},
{
id:12,
姓名:“,
儿童:[
{
id:121,
姓名:“,
儿童:[],
},
{
身份证号码:122,
姓名:“,
儿童:[],
},
],
},
],
},
{
id:2,
姓名:“,
儿童:[
{
id:21,
姓名:“,
儿童:[],
},
{
身份证号码:22,
姓名:“,
儿童:[
{
身份证号码:221,
姓名:“,
儿童:[],
},
{
id:222,
姓名:“,
儿童:[],
},
],
},
],
},
];
updateAttr(数据);

console.log(data)
这里是一个使用的迭代版本。它相对干净,但是它确实引入了依赖关系,因此有一个折衷

//const objectScan=require('object-scan');
const myData=[{id:1,名称:'',子项:[{id:11,名称:'',子项:[{id:12,名称:'',子项:[{id:121,名称:'',子项:[]},{id:122,名称:'',子项:[{id:2,名称:'',子项:[{id:21,名称:'',子项:[]},{id:22,名称:'',子项:[{id:221名称:'',子项:[],{id:222,名称:“”,子项:[]}]}];
常量myPRNG=(值)=>Math.abs(Math.floor(Math.sin(值)*1000));
const modify=(数据,rng)=>objectScan(['**.id']{
rtn:'计数',
filterFn:({parent,property,value})=>{
父项[属性]=rng(值);
}
})(数据);
日志(修改(myData,myPRNG));
// => 10
console.log(myData);
//=>[{id:841,名称:'',子项:[{id:1000,名称:'',子项:[{id:537,名称:'',子项:[{id:998,名称:'',子项:[]},{id:498,名称:'',子项:[id:909,名称:'',子项:[{id:836,名称:'',子项:[},{id:9,名称:'',子项:[{id:885,名称:'',子项:[],{id:868,名称:'',子项:[]}]}]
。作为控制台包装{最大高度:100%!重要;顶部:0}

我给你编了一个片段。请编一个