2016-09-10 56 views
3

我有對象的毗連多維數組成一維陣列

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

我想要一個新的數組[ 1, 2, 3, 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);