2016-12-23 6 views
1

Я пытаюсь отобразить объект JSON, используя lodash. Я звоню объект 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"} 
},... ] 

Я пытаюсь создать карту, которая имеет a Доходный период: соотношение оставшихся полей, поэтому

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

Чтение документов, на самом деле это не так, как идти abou Это я ... Как бы это сделать?

+0

Я не понимаю, что вы пытаетесь получить. Вы пытаетесь получить список доходов и отношений с остальными полями или хеш этого? –

+0

Моя цель состоит в том, чтобы иметь отчет о доходах, где пользователь выбирает, например, «март 2016», и он отображает данные за март в одном столбце, а также суммирует все значения «Год от даты до марта» для отображения в соседнем колонка. Если список делает это лучше, чем хеш, то так оно и есть. Но мне просто нужна «дата»: «Доход за этот период» - я недостаточно осведомлен, чтобы знать, что такое идеальный тип объекта. –

+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: невозможно прочитать свойство« доход_период »неопределенного» –

+0

Я не понимаю как «x» var выше отличается от «json» var –

+0

@jeffm Snippet обновлен, чтобы рассмотреть недостающие доходы_периоды ... Сообщите мне. – gaetanoM

0

использование _.keyBy преобразовать массив в объект с помощью ключа

_.chain(data) 
    .map('fields') 
    .keyBy('income_period') 
    .mapValues(function(val) { 
     return _.omit(val, 'income_period'); 
    }) 
    .value();