2016-12-08 7 views
2

現在、オブジェクト内の配列内に配列として格納されているメタデータのリストを取得しようとしています。配列からのオブジェクトからのconcat配列

[ 
    { 
     name: 'test', 
     metadata: [ 
      { 
       name: 'Author', 
       value: 'foo' 
      }, 
      { 
       name: 'Creator', 
       value: 'foo' 
      } 
     ] 
    }, 
    { 
     name: 'otherTest', 
     metadata: [ 
      { 
       name: 'Created', 
       value: 'foo' 
      }, 
      { 
       name: 'Date', 
       value: 'foo' 
      } 
     ] 
    }, 
    { 
     name: 'finalTest' 
    } 
] 

私の目的は、冗長性のないメタデータのリスト(名前で)を取得することです。私は.map()が成功の鍵だと思っていますが、私は短い方法でそれを行う方法を見つけることができません。実際には私のコードは2と3で構成されています。

期待入力がある:それはいくつかの機能のために助けることができる場合、私は、活字体で研究開発をしてい['Author', 'Creator', 'Created', 'Date']

+0

あなたは 'metadata'から何が必要なのですか?オブジェクト全体または部分だけ? –

+0

名前のみです。最初の投稿を編集します – Sakuto

+2

上記の入力のためのあなたの望ましい出力は何ですか? –

答えて

3

reduce()を使用してからmap()を使用すると、名前の配列を返すことができます。

var data = [{"name":"test","metadata":[{"name":"Author","value":"foo"},{"name":"Creator","value":"foo"}]},{"name":"otherTest","metadata":[{"name":"Created","value":"foo"},{"name":"Date","value":"foo"}]},{"name":"finalTest"}] 
 

 
var result = [...new Set(data.reduce(function(r, o) { 
 
    if (o.metadata) r = r.concat(o.metadata.map(e => e.name)) 
 
    return r 
 
}, []))]; 
 

 

 
console.log(result)

+0

名前が連結されていると見えますが、一意性をチェックせずに配列に入ります。 –

+0

@ニーナ・ショルツェ私の悪い、それを修正しました。 –

2

あなたはユニークな名前のためにSetを使用することができます。

var data = [{ name: 'test', metadata: [{ name: 'Author', value: 'foo' }, { name: 'Creator', value: 'foo' }] }, { name: 'otherTest', metadata: [{ name: 'Created', value: 'foo' }, { name: 'Date', value: 'foo' }] }, { name: 'finalTest' }], 
 
    names = new Set; 
 

 
data.forEach(a => (a.metadata || []).forEach(m => names.add(m.name))); 
 

 
console.log([...names]);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1
var data = [{"name":"test","metadata":[{"name":"Author","value":"foo"},{"name":"Creator","value":"foo"}]},{"name":"otherTest","metadata":[{"name":"Created","value":"foo"},{"name":"Date","value":"foo"}]},{"name":"finalTest"}] 

data 
.filter(function(obj){return obj.metadata != undefined}) 
.map(function(obj){return obj.metadata}) 
.reduce(function(a,b){return a.concat(b)},[]) 
.map(function(obj){return obj.name}) 
1

次のようにArray.prototype.reduce()Array.prototype.map()はそれを行う必要があります手に手。

var arr = [ 
 
    { 
 
     name: 'test', 
 
     metadata: [ 
 
      { 
 
       name: 'Author', 
 
       value: 'foo' 
 
      }, 
 
      { 
 
       name: 'Creator', 
 
       value: 'foo' 
 
      } 
 
     ] 
 
    }, 
 
    { 
 
     name: 'otherTest', 
 
     metadata: [ 
 
      { 
 
       name: 'Created', 
 
       value: 'foo' 
 
      }, 
 
      { 
 
       name: 'Date', 
 
       value: 'foo' 
 
      } 
 
     ] 
 
    }, 
 
    { 
 
     name: 'finalTest' 
 
    } 
 
]; 
 

 
result = arr.reduce((p,c) => c.metadata ? p.concat(c.metadata.map(e => e.name)) 
 
             : p, []); 
 
console.log(result);

+0

私のタイスクリプトコードではもう動作しないようですが、それは新しいアップデートや何かに関連していますか? – Sakuto

+0

'c.metadataのようなこのスニペットでは、いくつかの型変換が行われます。 ... 'あなたがTypeScriptでこれらを実行できるかどうかはわかりません。私はそれが型に厳密でなければならないと思う名前から。 TypeScriptを使用したことがあったのですか? – Redu

関連する問題