2016-05-12 12 views
0

json配列の各列にユニークな項目を取得しようとしています。私はこれを変換したい:キーに基づいてjsonarrayをlodashアンダースコアで分割する

VARアイテム= [{ "名前": "タイプ1"、 "ID":13}、{ "名前": "タイプ2"、 "ID": 14} {"name": "Type 2"、 "id":{"name": "type"、 "id":14}、{"name": "Type 3"、 "id":13} 12}、{"name": "Type 3"、 "id":12}];

[{ "タイプ1"、 "タイプ2"、 "タイプ3"}、{12,13,14}]

これは私が試したものです:

var uniq1 = _.map(_.uniqBy(items, 'id'), 'id'); 
var uniq2 =_.map(_.uniqBy(items, 'name'), 'name') 
console.log(uniq1,uniq2) 

フィドル:https://jsfiddle.net/yogeshwaran/5ntfzss1/

しかし、これはトンと思われます私の実際のデータセットがはるかに大きいので、私のユースケースでは非効率的な解決策になります(各要素に6つのキーがある100000要素)。それぞれのキーに固有の値をすべて取得する方法はありますか?私は毎回セット全体を反復したくありません。私の理想的なアプローチは次のとおりです。 1.キーに基づいて配列を分割します。 2.分割のそれぞれに固有のものを見つけます。 3.結果を結合します。

ありがとうございました。

+0

jsより効率的になるように設定する(ブラウザサポートに注意してください) – juvian

+0

Webアプリケーション用のブラウザで行うのか、JSONデータを処理するのですか?後者の場合、大規模なJSONデータセットの処理に 'jq'を使用することをお勧めします。たくさんのヘルパー関数(https://stedolan.github.io/jq/manual/#TypesandValues)があります。 – aug

答えて

1

あなたは配列をトランスポーズする配列、_.zip()にオブジェクトを変換するために組み合わせ_.values()を使用して、_.uniq()でそれらをマッピングすることができます。

あなたはバニラのJSを使用するか、新しいことができますいずれか

var items = [ 
 
    {"name": "Type 1","id": 13, "position": "manager"}, 
 
    {"name": "Type 2","id": 14, "position": "manager"}, 
 
    {"name": "Type 3","id": 14, "position": "manager"}, 
 
    {"name": "Type 3","id": 13, "position": "worker"}, 
 
    {"name": "Type 2","id": 12, "position": "worker"}, 
 
    {"name": "Type 3","id": 12, "position": "manager"} 
 
]; 
 

 
var result = _.zip.apply(_, items.map(_.values)).map(_.uniq); 
 

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

関連する問題