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

在javascript中,编写向嵌套数组的每个对象添加属性的算法的方法有哪些?

在javascript中,编写向嵌套数组的每个对象添加属性的算法的方法有哪些?,javascript,arrays,algorithm,recursion,tail-recursion,Javascript,Arrays,Algorithm,Recursion,Tail Recursion,buildSimList是我正在进行的工作。 我知道如何遍历每个项,以及如何使用递归展平嵌套数组。然而,我的大脑却在寻找最好的方法来生成一个具有相同数组结构但数据格式不同的数组。例如,我的buildSimList应该将数据数组转换为类似于以下内容的数组 const data = [ 1,2,3,4,5,[6,7,8], ] function goEach(items) { if (items.length) { items.for

buildSimList是我正在进行的工作。 我知道如何遍历每个项,以及如何使用递归展平嵌套数组。然而,我的大脑却在寻找最好的方法来生成一个具有相同数组结构但数据格式不同的数组。例如,我的buildSimList应该将数据数组转换为类似于以下内容的数组

    const data = [
      1,2,3,4,5,[6,7,8],
    ]

    function goEach(items) {
      if (items.length) {
        items.forEach((item) => goEach(item))
      } else {
        console.log(items);
      }
    }

    let newList = [];
    function buildNewList(items) {
      if (items.length) {
        items.forEach((item) => buildNewList(item))
      } else {
        newList.push(items);
        // console.log(items);
      }
    }

    let simList = [];
    function buildSimList(items) {
      if (items.length) {
        items.forEach((item) => buildSimList(item))
      } else {
        simList.push({id: items, checked: false});
        // console.log(items);
      }
    }

有没有一个直观的方法来实现它?我想不出有什么。即使使用lodash这样的库也可以是一个很好的解决方案。

当您要将一个数组转换为另一个数组时,首先要考虑的是映射。根据您的要求,以下是我对您问题的解决方案:

常数数据=[ 1, 2, 3, 4, 5, [6, 7, 8] ]; const buildSimList=数组=> //用map变换数组 array.mapitem=> //检查当前项是否为数组 数组的项实例 //如果它是一个数组,那么递归地变换它 ? buildSimListitem //如果不是,则将数字转换为对象 :{id:item,选中:false} ;
console.logbuildSimListdata 当您想将一个数组转换为另一个数组时,首先要考虑的是映射。根据您的要求,以下是我对您问题的解决方案:

常数数据=[ 1, 2, 3, 4, 5, [6, 7, 8] ]; const buildSimList=数组=> //用map变换数组 array.mapitem=> //检查当前项是否为数组 数组的项实例 //如果它是一个数组,那么递归地变换它 ? buildSimListitem //如果不是,则将数字转换为对象 :{id:item,选中:false} ; console.logbuildSimListdata 将forEach函数与递归一起使用,并使用typeof关键字或instanceof关键字检查元素的类型

常量数据=[1,2,3,4,5,6,7,8]; 让convert=acc/*这是当前累加器*/,数组=>{ array.forEachn=>{ 数组的if n instanceof{ 让newAcc=[];//新累加器,因为迭代发现了一个数组。 acc.pushnewAcc; convertnewAcc,n;//新累加器的递归 }else acc.push{id:n,clicked:false}; }; }; 让结果=[]; 结果、数据; console.logresult; .作为控制台包装{ 最大高度:100%!重要 } 将forEach函数与递归一起使用,并使用typeof关键字或instanceof关键字检查元素的类型

常量数据=[1,2,3,4,5,6,7,8]; 让convert=acc/*这是当前累加器*/,数组=>{ array.forEachn=>{ 数组的if n instanceof{ 让newAcc=[];//新累加器,因为迭代发现了一个数组。 acc.pushnewAcc; convertnewAcc,n;//新累加器的递归 }else acc.push{id:n,clicked:false}; }; }; 让结果=[]; 结果、数据; console.logresult; .作为控制台包装{ 最大高度:100%!重要
} 如果使用递归函数,则转换嵌套数组中的项和展平此类数组都非常简单

您所要做的就是遍历每个项,如果它不是另一个数组,则执行所需的转换。否则,将递归。下面是代码段中数据的示例:

常量数据=[1,2,3,4,5,6,7,8]] 函数转换器{ 返回arr.mapitem=>{ 数组的if item instanceof返回convertitem; 返回{id:item,clicked:false}; }; } 常量映射=转换数据; console.logmapped; 函数展平{ return[].concat…arr.mapitem=>{ 如果数组的item instanceof返回一个item; 返回[项目]; }; } 常数平坦=平坦;
如果使用递归函数,那么转换嵌套数组中的项和展平这样的数组都非常简单

您所要做的就是遍历每个项,如果它不是另一个数组,则执行所需的转换。否则,将递归。下面是代码段中数据的示例:

常量数据=[1,2,3,4,5,6,7,8]] 函数转换器{ 返回arr.mapitem=>{ 数组的if item instanceof返回convertitem; 返回{id:item,clicked:false}; }; } 常量映射=转换数据; console.logmapped; 函数展平{ return[].concat…arr.mapitem=>{ 如果数组的item instanceof返回一个item; 返回[项目]; }; } 常数平坦=平坦; console.logflat解释使用我的代码片段中的符号

在convert中迭代数据时,我们必须涵盖两种情况:

numOrArray是一个数字,在这种情况下,我们将其映射到对象 numOrArray是一个数组,在这种情况下,我们开始嵌套迭代。这可能是一个递归调用,因为嵌套数组的逻辑是相同的。 //将给定数字转换为具有id和单击属性的对象: constToObject=num=>{id:num,clicked:false}; //迭代给定数据并将其中的所有数字转换为 //具有toObject的对象。如果遇到一个数组 呃,, //以该数组作为参数递归调用convert。 const convert=数据=>{ return data.mapnumarray=>Array.isarraynumorray ?努莫拉雷 :toObjectnumOrArray; } //试驾! 常量数据=[1,2,3,4,5,6,7,8]; console.logconvertdata 解释使用我的代码段中的符号

在convert中迭代数据时,我们必须涵盖两种情况:

numOrArray是一个数字,在这种情况下,我们将其映射到对象 numOrArray是一个数组,在这种情况下,我们开始嵌套迭代。这可能是一个递归调用,因为嵌套数组的逻辑是相同的。 //将给定数字转换为具有id和单击属性的对象: constToObject=num=>{id:num,clicked:false}; //迭代给定数据并将其中的所有数字转换为 //具有toObject的对象。如果遇到数组, //以该数组作为参数递归调用convert。 const convert=数据=>{ return data.mapnumarray=>Array.isarraynumorray ?努莫拉雷 :toObjectnumOrArray; } //试驾! 常量数据=[1,2,3,4,5,6,7,8];
console.logconvertdata 您很接近,因为您对非数组执行一个对象,而在不执行时递归,但您正在向同一数组添加对象,因此这将导致扁平结构。这与使用高阶函数将每个数组变为数组和每个元素变为对象的情况相同:

常量数据=[1,2,3,4,5,6,7,8]] 函数转换器{ 返回数组的e实例? e、 地图转换: {id:e,单击:false}; }
console.logconvertdata 您很接近,因为您对非数组执行一个对象,而在不执行时递归,但您正在向同一数组添加对象,因此这将导致扁平结构。这与使用高阶函数将每个数组变为数组和每个元素变为对象的情况相同:

常量数据=[1,2,3,4,5,6,7,8]] 函数转换器{ 返回数组的e实例? e、 地图转换: {id:e,单击:false}; }
console.logconvertdata 我建议使用Array.prototype.map这样的通用函数,但也可以使用映射嵌套数组的函数——我们称之为deepMap

常量标识=x=> x const deepMap=f=identity,xs=[]=> xs.map x=> Array.isArray x ? 深度地图f,x :f x const makeObject=id=0,clicked=false=> {id,单击} 常量数据= [ 1, 2, 3, 4, 5, [ 6, 7, 8 ] ] console.log deepMap makeObject,数据 //[{id:1,单击:false} //,{id:2,单击:false} //,{id:3,单击:false} //,{id:4,单击:false} //,{id:5,单击:false} //,[{id:6,单击:false} //,{id:7,单击:false} //,{id:8,单击:false} // ]
//]我建议使用类似Array.prototype.map的通用函数,但也可以使用映射嵌套数组的函数–我们将其称为deepMap

常量标识=x=> x const deepMap=f=identity,xs=[]=> xs.map x=> Array.isArray x ? 深度地图f,x :f x const makeObject=id=0,clicked=false=> {id,单击} 常量数据= [ 1, 2, 3, 4, 5, [ 6, 7, 8 ] ] console.log deepMap makeObject,数据 //[{id:1,单击:false} //,{id:2,单击:false} //,{id:3,单击:false} //,{id:4,单击:false} //,{id:5,单击:false} //,[{id:6,单击:false} //,{id:7,单击:false} //,{id:8,单击:false} // ]
//我认为它真的很优雅,而且考虑到你如何转换成地图。很好。我觉得它真的很优雅,而且考虑到你如何转换成地图。美好的
   [
      {id: 1, clicked: false},
      {id: 2, clicked: false},
      {id: 3, clicked: false},
      {id: 4, clicked: false},
      {id: 5, clicked: false},
      [
        {id: 6, clicked: flase},
        {id: 7, clicked: flase},
        {id: 8, clicked: flase},
      ],
    ]