2017-09-07 7 views
-1

に異なる形式に変換しながら、私は私のように変換関数を使用してい以下形式マージ配列のJavaScript

cars = [ 
{id: 1, make: 'audi', year: '2010', someProperty: true}, 
{id: 2, make: 'bmw', year: '2011', someProperty: false}, 
{id: 3, make: 'bmw', year: '2011', someProperty: true}, 
{id: 4, make: 'vw', year: '2010', someProperty: true}, 
{id: 5, make: 'vw', year: '2011', someProperty: true}, 
{id: 6, make: 'audi', year: '2011', someProperty: true}, 
{id: 7, make: 'bmw', year: '2010', someProperty: false}, 
{id: 8, make: 'bmw', year: '2011', someProperty: false}, 
{id: 9, make: 'bmw', year: '2010', someProperty: true} 
] 

の配列と以下の形式に変換し、

requiredFormat = [ 
    { 
    somePropertyTrue: [ 
     {id: 1, make: 'audi', year: '2010', someProperty: true}, 
     {id: 4, make: 'vw', year: '2010', someProperty: true}, 
     {id: 9, make: 'bmw', year: '2010', someProperty: true} 
    ], 
    somePropertyFalse: [ 
     {id: 7, make: 'bmw', year: '2010', someProperty: false} 
    ], 
    year: '2010' 
    }, 
    { 
    somePropertyTrue: [ 
     {id: 3, make: 'bmw', year: '2011', someProperty: true}, 
     {id: 5, make: 'vw', year: '2011', someProperty: true}, 
     {id: 6, make: 'audi', year: '2011', someProperty: true} 
    ], 
    somePropertyFalse: [ 
     {id: 2, make: 'bmw', year: '2011', someProperty: false}, 
     {id: 8, make: 'bmw', year: '2011', someProperty: false} 
    ], 
    year: '2011' 
    } 
] 

を有します以下、

function transform(cars) { 
    return [...cars.reduce ((acc, car) => { 
     const yearGrp = acc.get(car.year) || { 
      somePropertyTrue: [], 
      somePropertyFalse: [], 
      year: car.year 
     }; 
     yearGrp['someProperty' + (car.someProperty ? 'True' : 'False')].push(car); 
     return acc.set(car.year, yearGrp); 
    }, new Map).values()]; 
} 

私は最初の配列をreadlineで読み込み、2000個のアイテムをすべて一時停止しています。すべての変換されたアイテムが1つの配列にマージされるように、以前に変換された配列を受け入れるように上記の関数を拡張するために、私は以下を試しましたが、これにアプローチする方法ではないことがわかります。ここ

let transform = function transform(cars) { 
    return [...cars.reduce((acc, arr) => { 
     if (!first) { 
      parsedArray.reduce((a) => { 
       const yearGrp = a.get(arr.year) || 
        acc.get(arr.year) || { 
         somePropertyTrue: [], 
         somePropertyFalse: [], 
         year: arr.year 
        }; 
       yearGrp['someProperty' + (car.someProperty ? 'True' : 'False')].push(arr); 
       return a.set(arr.year, yearGrp); 
      }); 
     } else { 
      const yearGrp = acc.get(arr.year) || { 
       somePropertyTrue: [], 
       somePropertyFalse: [], 
       year: arr.year 
      }; 
      yearGrp['someProperty' + (car.someProperty ? 'True' : 'False')].push(arr); 
      return acc.set(arr.year, yearGrp); 
     } 
    }, new Map())]; 
}; 

、parsedArrayは私が最初に時間を埋めるためにしようとしたものだとすることを他のすべての時間を使用しようと、 '最初の' フラグ

+1

のように、それはデータのさらなる挿入のためのマップ/ 'acc'を維持する方が良いでしょう、マップ上の閉鎖を使用して機能を返すことができます。変換されたデータが必要な場合は、スナップショットを取り出すことができます。車から犯罪への素敵なモーフィング;-) –

+0

更新を忘れて、それを編集します:) thanks – Sriram

+0

どのように私はaccのスナップショットを取る、私はそれを取る場合は、どのように私は同じ再利用2回目ですか? – Sriram

答えて

0

Array.prototype.reduce()ソリューションです:

var cars = [ 
 
    {id: 1, make: 'audi', year: '2010', someProperty: true}, {id: 2, make: 'bmw', year: '2011', someProperty: false}, 
 
    {id: 3, make: 'bmw', year: '2011', someProperty: true}, {id: 4, make: 'vw', year: '2010', someProperty: true}, 
 
    {id: 5, make: 'vw', year: '2011', someProperty: true}, {id: 6, make: 'audi', year: '2011', someProperty: true}, 
 
    {id: 7, make: 'bmw', year: '2010', someProperty: false}, {id: 8, make: 'bmw', year: '2011', someProperty: false}, 
 
    {id: 9, make: 'bmw', year: '2010', someProperty: true} 
 
], 
 
requiredFormatData = []; 
 
// grouping by 'year' 
 
groups = cars.reduce(function(r, o){ 
 
    var k = 'someProperty' + ((o.someProperty)? 'True':'False'); 
 
    if (r[o.year]){ \t 
 
    \t (r[o.year][k]) && r[o.year][k].push(o) || (r[o.year][k] = [o]); 
 
    } else { 
 
    \t r[o.year] = {year: o.year}; 
 
    \t r[o.year][k] = [o]; 
 
     requiredFormatData.push(r[o.year]); 
 
    } 
 
    return r; 
 
}, {}); 
 

 
console.log(requiredFormatData);

+0

ここでの問題は、requiredFormatDataにすでに2010年があり、グループが呼び出されたときに2回目にそれがチェックされず、requiredFormatDataに2010年の重複が追加された場合、これをマージしようとしています – Sriram

+0

@Sriram、あなたの言ったように、私のアプローチが重複した2010 *を追加するテストケース。あなたの新しい問題は不明で、解決策が期待通りの出力を示します – RomanPerekhrest

+0

これは新しい問題ではありません。上記の配列を2つに分割してグループ関数を2回実行すると、これを見ることができます。質問に記載されています。私はこれを2000回のアイテムごとに一度やりたいと思っています。 – Sriram

0

マップの/は、データをさらに挿入することをお勧めします。変換されたデータが必要な場合は、スナップショットを取り出すことができます。

あなたは

var transform = (m => array => (array.forEach(a => m.set(...a)), [...m]))(new Map); 
 

 
console.log(transform([['a', 1], ['b', 2]])); 
 
console.log(transform([['c', 3], ['d', 4]]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

関連する問題