2016-10-25 8 views
0

オブジェクトA1 =配列フィールド上のオブジェクトのネストされた配列を平らに

[{name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]}, 
{name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]] 

所望の出力有無:

[{name:'x',age:21, addr:{flat:1,add:'xyz'}}, 
{name:'x',age:21, addr:{flat:2,add:'xsr'}}, 
{name:'y',age:22, addr:{flat:3,add:'xyz1'}, 
{name:'y',age:22, addr:{flat:4,add:'xsr1'}] 

を提案してください!私はlodash/underscoreを使ってこれを達成しようとしています。

+0

あなたは配列をループに持っており、すべての要素のためにできるだけ多くの新しい代替オブジェを作成'addr'プロパティにあるように、何もハードなものはありません。 – Azamantes

+0

[Underscoreから重複した親子オブジェクトの配列を平坦化する]の可能な複製(http://stackoverflow.com/questions/18003083/underscore-to-flatten-nested-array-of-parent-child-objects) –

答えて

0

addrフィールドの数に応じたアイテムの数と、新しいアレイに元の配列内のすべての項目の地図。コンカットを使用してすべてを新しい配列にフラット化します。

IEでサポートされていないので、バーベルなどでES5に移動している場合は、Object.assign()を使用して新しいアイテムを作成できます。ただし、角度を使用しているため、代わりにangular.extendを使用できます。

ES5:

var arr = [ 
 
    {name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]}, 
 
    {name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]} 
 
]; 
 
    
 
var result = [].concat.apply([], arr.map(function(item) {  
 
    return item.addr.map(function(addr) { 
 
    return angular.extend({}, item, { addr: addr }); 
 
    }); 
 
})); 
 

 
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>

ES6:

const arr = [ 
 
    {name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]}, 
 
    {name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]} 
 
]; 
 
    
 
const result = [].concat(...arr.map((item) => item.addr.map((addr) => Object.assign({}, item, { addr })))); 
 

 
console.log(result);

0

必要な結果を構築するために、配列と内部配列を反復することができます。

var array = [{ name: 'x', age: 21, addr: [{ flat: 1, add: 'xyz' }, { flat: 2, add: 'xsr' }] }, { name: 'y', age: 22, addr: [{ flat: 3, add: 'xyz1' }, { flat: 4, add: 'xsr1' }] }], 
 
    result = array.reduce(function (r, a) { 
 
     return r.concat(a.addr.map(function (b) { 
 
      return { name: a.name, age: a.age, addr: b }; 
 
     })); 
 
    }, []); 
 

 
console.log(result);

ES6

var array = [{ name: 'x', age: 21, addr: [{ flat: 1, add: 'xyz' }, { flat: 2, add: 'xsr' }] }, { name: 'y', age: 22, addr: [{ flat: 3, add: 'xyz1' }, { flat: 4, add: 'xsr1' }] }], 
 
    result = array.reduce((r, a) => r.concat(a.addr.map(b => ({ name: a.name, age: a.age, addr: b }))), []); 
 

 
console.log(result);

0

あなたは望ましい結果を返すためにreduce()forEach()Object.assign()を使用することができます。

var data = [{name:'x',age:21, addr:[{flat:1,add:'xyz'},{flat:2,add:'xsr'}]}, 
 
{name:'y',age:22, addr:[{flat:3,add:'xyz1'},{flat:4,add:'xsr1'}]}]; 
 

 
var result = data.reduce(function(r, o) { 
 
    o.addr.forEach(function(e) { 
 
    r.push(Object.assign({name: o.name, age: o.age}, e)); 
 
    }) 
 
    return r; 
 
}, []); 
 

 
console.log(result)

関連する問題