`javascript中的map`和'filter'

`javascript中的map`和'filter',javascript,node.js,Javascript,Node.js,具有以下输入: var m = [{ name: 'foo', routes: [{verb: 'post', path: '/foo1'}, {verb: 'get', path: '/foo2'}] }, { name: 'bar', routes: [{verb: 'put', path: '/:id'}]}, { name: '__ignoreme', routes: [{verb: 'post', path: '/ba

具有以下输入:

var m = [{
    name: 'foo',
    routes: [{verb: 'post', path: '/foo1'},
      {verb: 'get', path: '/foo2'}]
  }, {
    name: 'bar',
    routes: [{verb: 'put', path: '/:id'}]},
  {
    name: '__ignoreme',
    routes: [{verb: 'post', path: '/baz1'},
      {verb: 'get', path: '/baz2'}]
  }]
使用
map
filter
我想实现:

  var desired = [
  'foo POST /foo1',
  'foo GET /foo2',
  'bar PUT /:id',
]
完整代码:

    var m = [{
        name: 'foo',
        routes: [{verb: 'post', path: '/foo1'},
          {verb: 'get', path: '/foo2'}]
      }, {
        name: 'bar',
        routes: [{verb: 'put', path: '/:id'}]},
      {
        name: '__ignoreme',
        routes: [{verb: 'post', path: '/baz1'},
          {verb: 'get', path: '/baz2'}]
      }]



    var desired = [
      'foo POST /foo1',
      'foo GET /foo2',
      'bar PUT /:id',
    ]


    var myOutput = m
            .filter(function (m) {
              return m.name.indexOf('__') === -1;
            })
            .map(function (m) {
              return [
                m.name,
                m.routes[0].verb.toUpperCase(),    // I should loop through my array instead of getting just the first element
// But can I loop through the array in my map?        
                m.routes[0].path
              ].join(' ');
            });


    console.log('>myOutput:', myOutput);
    // What I achieve which is not desired : 
    // [
    // 'foo POST /foo1',
    //  'foo PUT /:id',
    //]

这是我的代码中使用的结构,我希望通过微小的更改实现所需的输出,并且仍然使用
map
filter

您可以在map函数中使用循环,以确保查看给定名称的所有路由。这将返回一个数组,因此我在映射后使用reduce将其展平为单个字符串数组

var myOutput = m
        .filter(function (m) {
          return m.name.indexOf('__') === -1;
        })
        .map(function (m) {
          var arr = [];
          for(var i = 0; i < m.routes.length; i++){
            arr.push([
              m.name,
              m.routes[i].verb.toUpperCase(),            
              m.routes[i].path
            ].join(' '));
          }
          return arr;
        }).reduce(function(prev, cur){
          return prev.concat(cur);
        });
var myOutput=m
.过滤器(功能(m){
返回m.name.indexOf(''uuu')=-1;
})
.map(功能(m){
var-arr=[];
对于(变量i=0;i

这会导致myOutput的
[“foo POST/foo1”、“foo GET/foo2”、“bar PUT/:id”]
您需要在每个项目中迭代您的
路由
数组,并映射值以获得
动词
路径

var m=[{
名称:“foo”,
路由:[{动词'post',路径:'/foo1'},
{动词'get',路径:'/foo2'}]
}, {
名称:'酒吧',
路由:[{动词'put',路径:'/:id'}]},
{
姓名:“_ignoreme”,
路由:[{动词'post',路径:'/baz1'},
{动词'get',路径:'/baz2'}]
}]
所需变量=[
‘foo POST/foo1’,
“foo-GET/foo2”,
'bar PUT/:id',
]
var myOutput=m
.过滤器(功能(a){
返回a.name.indexOf(“”(uuu))=-1;
})
.map(功能(a){
返回a.routes.map(函数(项){
返回[
a、 名字,
item.verb.toUpperCase(),
item.path
].加入(“”);
});
})
.减少(功能(上一个,当前){
返回上一个concat(当前);
})

编写('>myOutput:',myOutput)过滤输入后,可以将每组路由转换为所需格式,然后使用将这些阵列连接在一起:

var m=[
{
名称:“foo”,
路线:[
{动词'post',路径:'/foo1'},
{动词'get',路径:'/foo2'}]
},{
名称:'酒吧',
路线:[
{动词'put',路径:'/:id'}]
},{
姓名:“_ignoreme”,
路线:[
{动词'post',路径:'/baz1'},
{动词'get',路径:'/baz2'}]
}
];
变量过滤器=函数(a){
返回a.filter(函数(x){
返回x.name!='\u ignoreme';
});
};
var format=函数(名称、路由){
返回name++''+route.verb.toUpperCase()++''+route.path;
};
变量过程=函数(a){
如果(!a.长度){
返回[];
}
返回[0].routes.map(函数(r){
返回格式(a[0]。名称,r);
}).concat(过程(a.slice(1));
}

console.log(进程(过滤器(m))是的,有没有办法循环到我的数组中?我不明白,您希望输出中出现
'foo GET/foo2'
?但是您已经明确地将其过滤掉了。是的,如何在
map
函数中循环到路由数组中?