【问题标题】:Mapping JSON object with lodash用 lodash 映射 JSON 对象
【发布时间】:2016-12-23 19:42:15
【问题描述】:

我正在尝试使用 lodash 映射 JSON 对象。我调用json对象如下:

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", ... }

阅读文档,它并没有真正解决如何解决这个问题......我将如何完成这个?

【问题讨论】:

  • 我不明白你想得到什么。您是要获取收入期和剩余字段关系列表还是其中的哈希值?
  • 我的目标是有一个损益表,例如,用户选择“2016 年 3 月”,它将 3 月的数据显示在一列中,并将所有值相加到 3 月显示在相邻的列中。如果列表比散列做得更好,那就这样吧。但我只需要一个“日期”:该时期关系的收入 - 我不够了解,不知道理想的对象类型是什么。
  • 预期结果是对象还是数组?
  • 我不确定你在问什么 - 结果是什么?
  • @jeffm "我正在尝试创建一个具有收入期间的地图:剩余字段关系,所以"2016-01-31" : {"lease_income_collected" : "994174", ... }" 是处理原始数组的预期结果对象本身?或者,作为数组元素的对象?

标签: jquery django lodash


【解决方案1】:

使用_.keyBy按键将数组转换为对象

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

【讨论】:

    【解决方案2】:

    您可以使用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);

    【讨论】:

      【解决方案3】:

      你可以使用_.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>

      【讨论】:

      • 我想知道我的问题是如何调用 JSON 对象。在控制台中,我可以输入 json() 或 tempArr = json();它返回 JSON 的显示方式(在 var x 中),但我在 var eleName 行中收到以下错误:“Uncaught TypeError: Cannot read property 'income_period' of undefined”
      • 我不明白上面的“x”变量与“json”变量有什么不同
      • @jeffm 代码段已更新,以考虑缺少的收入周期...让我知道。
      猜你喜欢
      • 2016-05-31
      • 2018-11-08
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 2018-08-18
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多