2016-09-10 15 views
3

に私は新しい配列[ 1, 2, 3, 1, 2, 3 ]をするオブジェクト連結方式の多次元配列1次元配列

const nodes = [ { children: [1, 2, 3] }, { children: [1, 2, 3] } ]; 

持つ配列を持っています。

私は

nodes.map(node => node.children); 

を試してみましたが、それは私を[ [ 1, 2, 3 ], [ 1, 2, 3 ] ]与えます。

私は

[].concat(nodes.map(node => node.children)); 

を試してみましたが、それはただ単に [ [ 1, 2, 3 ], [ 1, 2, 3 ] ]ある [ [ 1, 2, 3 ], [ 1, 2, 3 ] ][]を連結しているので、それは動作しません。

答えて

3

でこれを行うことができますArray#reduce

const nodes = [ { children: [1, 2, 3] }, { children: [1, 2, 3] } ], 
 
     result = nodes.reduce((r, node) => r.concat(node.children), []); 
 

 
console.log(result); 
 
console.log([... new Set(result)]); // for unique values
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

ありがとうございました!縮小した後、重複を '.filter((item、pos、self)=> self.indexOf(item)== pos)'で取り除いています。後で連鎖するのではなく、 'reduce'の内部でこれを行うのは意味がありますか? – mortensen

+1

あなたは['Set'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set)を使って一意の値を得ることができます。 –

+0

は 'Array.from(new Set(result))'と同じですか? – mortensen

3

あなたはあなたが使用することができArray#reduce

const nodes = [ { children: [1, 2, 3] }, { children: [1, 2, 3] } ]; 
 

 
var result = nodes.reduce(function(r, o) { 
 
    r = r.concat(o.children); 
 
    return r; 
 
}, []); 
 

 
console.log(result)

1

Array#forEachを使用してこれを行うための別の方法:

const nodes = [ { children: [1, 2, 3] }, { children: [1, 2, 3] } ] 
 
final = [] 
 
nodes.forEach(x => final = final.concat(x.children)) 
 
console.log(final)

別の短い方法は、(やろうとしていたものOPにほとんど変更)です:

const nodes = [ { children: [1, 2, 3] }, { children: [1, 2, 3] } ]; 
 
var result = [].concat.apply([], nodes.map(x => x.children)) 
 
console.log(result);