Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/4.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_Ramda.js - Fatal编程技术网

Javascript 我将如何改变这一点?

Javascript 我将如何改变这一点?,javascript,ramda.js,Javascript,Ramda.js,我想为下面的转换找到一个很好的优雅的解决方案。如何以最简单的方式(可选地使用函数库Ramda)最好地实现这一点 const data = [ { id: 'a', }, { id: 'b', routes: [ { id: 'c', }, { id: 'd', routes: [ { id: 'e', }

我想为下面的转换找到一个很好的优雅的解决方案。如何以最简单的方式(可选地使用函数库Ramda)最好地实现这一点

const data = [
  {
    id: 'a',
  },
  {
    id: 'b',
    routes: [
      {
        id: 'c',
      },
      {
        id: 'd',
        routes: [
          {
            id: 'e',
          }
        ]
      }
    ]
  }
];

const expected = [
  {
    id: 'a',
  },
  {
    id: 'b',
  },
  {
    id: 'c',
  },
  {
    id: 'd',
  },
  {
    id: 'e',
  }
];

下面是一个普通的JS解决方案,使用
reduce
和递归:

const数据=[
{
id:'a',
},
{
id:'b',
路线:[
{
id:'c',
},
{
id:'d',
路线:[
{
id:'e',
}
]
}
]
}
];
const transform=arr=>arr.reduce((a,{id,routes})=>(
[…a,{id},…变换(路由| |[])]
), []);

console.log(转换(数据))这是一个普通的JS解决方案,使用
reduce
和递归:

const数据=[
{
id:'a',
},
{
id:'b',
路线:[
{
id:'c',
},
{
id:'d',
路线:[
{
id:'e',
}
]
}
]
}
];
const transform=arr=>arr.reduce((a,{id,routes})=>(
[…a,{id},…变换(路由| |[])]
), []);

console.log(转换(数据))JS中的解决方案,没有太多的传播

函数getFlat(数组=[]){ 返回array.reduce((r,{id,routes})=>r.concat({id},getFlat(routes)),[]); } 常量数据=[{id:'a',},{id:'b',路由:[{id:'c',},{id:'d',路由:[{id:'e',}]}]; console.log(getFlat(data))
.as控制台包装{max height:100%!important;top:0;}
JS中的一个解决方案,没有太多的扩展

函数getFlat(数组=[]){ 返回array.reduce((r,{id,routes})=>r.concat({id},getFlat(routes)),[]); } 常量数据=[{id:'a',},{id:'b',路由:[{id:'c',},{id:'d',路由:[{id:'e',}]}]; console.log(getFlat(data))
.as console wrapper{max height:100%!important;top:0;}
这里的其他建议的替代方法是使用展开每个嵌套路由集

const fn = R.chain(({routes = [], ...rest}) => [{...rest}, ...fn(routes)])
一旦变得可用,这种方法也可以通过普通JS实现

const fn = (xs = []) => xs.flatMap(({routes, ...rest}) => [{...rest}, ...fn(routes)])

此处其他建议的替代方法是使用展开每个嵌套管线集

const fn = R.chain(({routes = [], ...rest}) => [{...rest}, ...fn(routes)])
一旦变得可用,这种方法也可以通过普通JS实现

const fn = (xs = []) => xs.flatMap(({routes, ...rest}) => [{...rest}, ...fn(routes)])

是否需要Ramda?嗯,我对其中任何一个都感兴趣。我更新了问题,以便不规定使用Ramda。非常感谢您在@CertainPerformanceIs Ramda required上花费的时间?嗯,我对其中任何一个都感兴趣。我更新了问题,以便不规定使用Ramda。非常感谢您在@CertainPerformancence上花费的时间,如果对象中有其他属性,并且属性名称“routes”可以传递到函数中,这将如何工作?请参阅编辑,如果希望在runtimeNice中指定包含嵌套对象的属性的名称,请使用括号表示法。如果在对象中有其他属性,并且可以将属性名称“routes”传递给函数,则如何使用括号表示法?请参见编辑,如果希望在运行时指定包含嵌套对象的属性的名称,请使用括号表示法