2016-05-25 5 views
3

` filter`:mapfilterを使用して`map`と、次の入力持つJavaScriptで

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 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', 
    //] 

これは私のコードで使用されている構造体で、私は小さなもので私の望む出力を達成したい変更して、まだmapfilterを使用しています。

+0

私の配列にループする方法はありますか? –

+0

私はあなたの出力に '' foo GET/foo2''を期待していますか?しかし、あなたはそれを明示的にフィルタリングしました。 –

+0

はい私の 'map'関数の中でどのように私のルート配列にループすることができますか? –

答えて

2

map関数の内部でループを使用すると、特定の名前のすべてのルートを確認できます。それは配列の配列を返すので、マップの後にreduceを使用して、それを文字列の単一の配列に平坦化します。

この結果、myOutputは["foo POST /foo1", "foo GET /foo2", "bar PUT /:id"]になります。

0

あなたがmap各セットすることができます、あなたの入力を濾過した後verbpath

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 (a) { 
 
       return a.name.indexOf('__') === -1; 
 
      }) 
 
      .map(function (a) { 
 
       return a.routes.map(function (item) { 
 
       return [ 
 
        a.name, 
 
        item.verb.toUpperCase(), 
 
        item.path 
 
       ].join(' '); 
 
       }); 
 
      }) 
 
      .reduce(function(prev, current){ 
 
       return prev.concat(current); 
 
      }) 
 

 

 
    document.write('>myOutput:', myOutput);

0

を取得するために、すべてのアイテムの中だけでなく、あなたのroutes配列を反復処理し、値をマッピングする必要があります次に、concatを使用してこれらのアレイを結合します。

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 filter = function(a){ 
 
    return a.filter(function(x){ 
 
     return x.name !== '__ignoreme'; 
 
    }); 
 
}; 
 

 
var format = function(name, route){ 
 
    return name + ' ' + route.verb.toUpperCase() + ' ' + route.path; 
 
}; 
 

 
var process = function(a){ 
 
    if(!a.length){ 
 
     return []; 
 
    } 
 
    return a[0].routes.map(function(r){ 
 
     return format(a[0].name, r); 
 
    }).concat(process(a.slice(1))); 
 
} 
 

 
console.log(process(filter(m)));

ES6バージョン

const 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'}] 
 
    } 
 
]; 
 

 
const filter = xs => xs.filter(x => x.name !== '__ignoreme'); 
 
const format = (name, route) => `${name} ${route.verb.toUpperCase()} ${route.path}`; 
 
const process = ([x,...xs]) => 
 
    x === undefined ? [] : [...x.routes.map(r => format(x.name,r)), ...process(xs)]; 
 

 
console.log(process(filter(m)));

ES6参照:
const
arrow functionsdestructuringとし、
template literals,
spread operatorとする。

関連する問題