2017-02-24 17 views
1

この問題を理解する方法を知っておく必要があるので、私は困惑していますが、複数のキーでオブジェクトの配列をグループ化しています。ここで複数のキーでオブジェクトの配列をグループ化する

はデータだ:私はほとんど成功して生成しようとしてきた何

[ 
     { 
     "car": "audi", 
     "type": "A6", 
     "style": "Avant", 
     "year": "1996" 
     }, 
     { 

     "car": "audi", 
     "type": "A4", 
     "style": "2", 
     "year": "2006" 
     }, 
     { 

     "car": "audi", 
     "type": "A4", 
     "style": "L W12", 
     "year": "2006" 
     }, 
     { 

     "car": "audi", 
     "type": "80", 
     "style": "GLE", 
     "year": "1975" 
     }, 
     { 

     "car": "audi", 
     "type": "A6", 
     "style": "Avant L", 
     "year": "1996" 
     }, 
     { 
     "car": "audi", 
     "type": "A6", 
     "style": "3.2 Multitronic", 
     "year": "2006" 
     }, 
] 

は次のとおりです。

[{ 
    "audi": [{ 
    "1996": { 
     "A6": ["Avant, Avant L"] 
    } 
    }, { 
    "2006": } 
     "A6": ["3.2 Multitronic"], 
     "A4": ["L W12", "2"] 
    } 
    } 
    .... 
}] 

スキーマです:

{ 
    "car1": [{ 
     "year1": { 
      "style1": ["trim1", "trim2"], 
      "style2": ["trim1", "trim2"] 
     }, 
     "year1": { 
      "style1": ["trim1", "trim2"], 
      "style2": ["trim1", "trim2"] 
     } 
    }], 
    "car2": [{ 
     "year1": { 
      "style1": ["trim1", "trim2"], 
      "style2": ["trim1", "trim2"] 
     }, 
     "year2": { 
      "style1": ["trim1", "trim2"], 
      "style2": ["trim1", "trim2"] 
     } 
    }] 
} 

私は」 veはlodashで次のように試しました

let result = _.chain(carData) 
    .groupBy('car') 
    .toPairs() 
    .map(function(curr) { 
     return _.zipObject(['car', 'year'], curr); 
    }) 
    .value(); 

This gets me part of the wayですが、車の年ごとのスタイルとタイプについては不完全なデータになります。

+3

あなたの試行を追加してください。 –

+0

更新されましたが、この場合はlodashを使用しないようにしています – hybrid9

答えて

1

与えられたプロパティに対してハッシュオブジェクトとネストされたアプローチを使用できます。

var data = [{ car: "audi", type: "A6", style: "Avant", year: 1996 }, { car: "audi", type: "A4", style: 2, year: 2006 }, { car: "audi", type: "A4", style: "L W12", year: 2006 }, { car: "audi", type: 80, style: "GLE", year: 1975 }, { car: "audi", type: "A6", style: "Avant L", year: 1996 }, { car: "audi", type: "A6", style: "3.2 Multitronic", year: 2006 }], 
 
    keys = ['car', 'year', 'type'], 
 
    result = []; 
 

 
data.forEach(function (a) { 
 
    keys.reduce(function (r, k) { 
 
     var o = {}; 
 
     if (!r[a[k]]) { 
 
      r[a[k]] = { _: [] }; 
 
      o[a[k]] = r[a[k]]._; 
 
      r._.push(o); 
 
     } 
 
     return r[a[k]]; 
 
    }, this)._.push(a.style); 
 
}, { _: result }); 
 
    
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

私の心は吹き飛ばされました。あなたのコードを少し歩いてもらえますか?私は特に、reduce()の初期値として渡される{_:result}について不思議です。 – hybrid9

+0

実際にはこのメソッドは基本的に[jsonオブジェクトの配列を別のjsonオブジェクトに変換する](http://stackoverflow.com/a/42401985/1447675)と同様ですが、キーのアクセスが簡単で結果はコールバックなしで簡単に作成できます。ハッシュテーブルの場合は、メソッドとグループ化機能の洞察を得ることができます。 –

1

ここで、無制限のキーで(やや冗長)あなたが望む正確にJSONオブジェクトの形状を生成ソリューションとグループです:

var cars = [{ 
 
    "car": "audi", 
 
    "type": "A6", 
 
    "style": "Avant", 
 
    "year": "1996" 
 
}, { 
 

 
    "car": "audi", 
 
    "type": "A4", 
 
    "style": "2", 
 
    "year": "2006" 
 
}, { 
 

 
    "car": "audi", 
 
    "type": "A4", 
 
    "style": "L W12", 
 
    "year": "2006" 
 
}, { 
 

 
    "car": "audi", 
 
    "type": "80", 
 
    "style": "GLE", 
 
    "year": "1975" 
 
}, { 
 

 
    "car": "audi", 
 
    "type": "A6", 
 
    "style": "Avant L", 
 
    "year": "1996" 
 
}, { 
 
    "car": "audi", 
 
    "type": "A6", 
 
    "style": "3.2 Multitronic", 
 
    "year": "2006" 
 
}, ]; 
 

 
function groupBy(list, prop) { 
 
    return list.reduce((groupped, item) => { 
 
    var key = item[prop]; 
 
    delete item[prop]; 
 
    if (groupped.hasOwnProperty(key)) { 
 
     groupped[key].push(item); 
 
    } else { 
 
     groupped[key] = [item]; 
 
    } 
 
    return groupped 
 
    }, {}); 
 
} 
 

 
function groupSubKeys(obj, properties, propIndex) { 
 
    var grouppedObj = groupBy(obj, properties[propIndex]); 
 
    Object.keys(grouppedObj).forEach((key) => { 
 
    if (propIndex < properties.length - 2) { 
 
     grouppedObj[key] = groupSubKeys(grouppedObj[key], properties, propIndex + 1); 
 
    } else { 
 
     grouppedObj[key] = grouppedObj[key].map(item => item[properties[propIndex + 1]]) 
 
    } 
 
    }); 
 
    return grouppedObj; 
 
} 
 

 
function groupByProperties(list, properties) { 
 
    return groupSubKeys(list, properties, 0); 
 
} 
 

 
console.log(groupByProperties(cars, ['car', 'year', 'type', 'style']));

はここです実行例: http://codepen.io/rarmatei/pen/evmBOo

+0

これもすばらしく見えます。サブキーでグループ分けして私の頭を包み込むことができず、空の配列で終わるだろう。私はあなたがこれをまとめるために提供した時間を感謝します。 – hybrid9

関連する問題