2016-12-23 16 views
1

私は、lodashを使ってJSONオブジェクトをマップしようとしています。次のように私は、JSONオブジェクトを呼んでいる:JSONオブジェクトとlodashのマッピング

var json = (function() { 
var json = null; 
$.ajax({ 
    'async': false, 
    'global': false, 
    'url': "{% url 'api_temp_income_statement' asset_details.id %}", 
    'datatype': "json", 
    'success': function (data) { 
     json = data; 
    } 
}); 
return json; 

})

次のようになりますJSONオブジェクトを返します

[{"model": "tempincomestatement", 
    "pk": 3, 
    "fields": {"income_period": "2016-01-31", "lease_income_collected": "994174.0000", "storage_income_collected": "236216.0000", "tax_income_collected": "131020.0000", "other_income_collected": "0.0000"} 
},... ] 

私が持っているマップを作成しようとしているが所得期間:残りのフィールドの関係ので、

"2016-01-31" : {"lease_income_collected" : "994174", ... } 

docsを読んで、それは本当にどのようにabouに行くのこれはどうしたらいい?

+0

によってオブジェクトへの配列を変換するために使用_.keyBy。あなたは収入期間と残りの分野の関係やそれのハッシュのリストを取得しようとしていますか? –

+0

私の目標は、たとえば、ユーザーが「March 2016」を選択し、3月のデータを1つの列に表示し、3月から3月までのすべての値を隣接するカラム。リストがハッシュよりも優れている場合は、それよりも優れています。しかし、私はちょうど "日付"が必要です:その期間関係の収入 - 私は理想的なタイプのオブジェクトが何であるか知るのに十分知識がありません。 –

+0

期待される結果がオブジェクトか配列ですか? – guest271314

答えて

0

あなたはObject.keys()、計算されたプロパティ名を使用することができ、Array.prototype.reduce()

var data = [{ 
 
    "model": "tempincomestatement", 
 
    "pk": 3, 
 
    "fields": { 
 
    "income_period": "2016-01-31", 
 
    "lease_income_collected": "994174.0000", 
 
    "storage_income_collected": "236216.0000", 
 
    "tax_income_collected": "131020.0000", 
 
    "other_income_collected": "0.0000" 
 
    } 
 
}]; 
 

 
var [, ...fields] = Object.keys(data[0].fields); 
 
var res = { 
 
    [data[0].fields.income_period]: fields.reduce((obj, prop) => 
 
    (obj[prop] = data[0].fields[prop], obj), {}) 
 
}; 
 

 
console.log(res);

0

あなたは_.map使用できます

var json = [{"model": "tempincomestatement", 
 
      "pk": 3, 
 
      "fields": {"income_period": "2016-01-31", "lease_income_collected": "994174.0000", "storage_income_collected": "236216.0000", "tax_income_collected": "131020.0000", "other_income_collected": "0.0000"} 
 
     }, {"model": "1", 
 
      "pk": 3, 
 
      "fields": {"income_period": "2016-01-31", "lease_income_collected": "994174.0000", "storage_income_collected": "236216.0000", "tax_income_collected": "131020.0000", "other_income_collected": "0.0000"} 
 
      }, {"model": "1", 
 
      "pk": 3, 
 
      "fields": {"lease_income_collected": "994174.0000", "storage_income_collected": "236216.0000", "tax_income_collected": "131020.0000", "other_income_collected": "0.0000"} 
 
      } ]; 
 
var result = _.map(json, function(obj) { 
 
    if (obj.fields.income_period !== undefined) { 
 
    var result = {}; 
 
    var eleName = obj.fields.income_period; 
 
    delete obj.fields.income_period; 
 
    result[eleName] = obj.fields; 
 
    return result; 
 
    } 
 
}); 
 
result = _.filter(result, Boolean); 
 

 
console.log(result);
<script src="https://cdn.jsdelivr.net/lodash/4.17.3/lodash.min.js"></script>

+0

私の問題がJSONオブジェクトの呼び出し方法であるかどうかは疑問です。コンソールでは、json()またはtempArr = json()と入力できます。それはJSONを(var x内で)上記のように正確に返しますが、var eleName行に次のエラーが表示されます: "Uncaught TypeError:未定義の 'income_period'プロパティを読み取れません" –

+0

私は分かりません上記の "x" varが "json"とどのように違うのかvar –

+0

@jeffm欠落したincome_periodsを考慮するためにスニペットが更新されました...教えてください。 – gaetanoM

0

私はあなたが取得しようとしているのか理解していないキー

_.chain(data) 
    .map('fields') 
    .keyBy('income_period') 
    .mapValues(function(val) { 
     return _.omit(val, 'income_period'); 
    }) 
    .value(); 
関連する問題