使用lodash或下划线进行Javascript对象转换

时间:2016-03-16 01:00:50

标签: javascript json object underscore.js lodash

我有很多具有以下结构的对象:

[{
     n_vId: 1,
     s_vName: 'test',
     d_date: '2016-03-15 00:00:00'
     f_a: 0,
     f_b: 0,
     f_c: 0,
     f_d: 4,
     f_e: 0,
     f_f: 0.1,
     f_g: 0
},
{
     n_vId: 2,
     s_vName: 'test',
     d_date: '2016-03-15 00:15:00'
     f_a: 1,
     f_b: 1,
     f_c: 0,
     f_d: 4,
     f_e: 0,
     f_f: 0.1,
     f_g: 0
}]

我想将此对象转换为

a = [
     {
         date: '2016-03-15 00:00:00',
         a: 0
     },
     {
         date: '2016-03-15 00:15:00',
         a: 1
     }
]

b = [
     {
         date: '2016-03-15 00:00:00',
         b: 0
     },
     {
         date: '2016-03-15 00:15:00',
         b: 1
     }
]
...

我可以改变它。但我觉得我的过程太复杂了。 所以,你会建议我正确的过程吗? 现在我使用lodash但可以使用下划线或其他js模块。

3 个答案:

答案 0 :(得分:2)

您只需使用地图:

a = data.map(function(i) {
        return {date: i.d_date, a: i.f_a};
    });

b = data.map(function(i) {
        return {date: i.d_date, b: i.f_b};
    });

对我来说似乎很简单。

答案 1 :(得分:1)

看看这个npm模块https://github.com/gabesoft/trans

   var trans = require('trans');
   var results = trans(data)
     .mapff('d_date', 'date')
     .mapff('f_a', 'a')
     .pick('date', 'a')
     .value();

答案 2 :(得分:1)

正如其他人所说,你不需要Lodash或Underscore,因为这只是一个map()操作,但你可以使用这些库中的_.map()函数。

var objs = [{
  n_vId: 1,
  s_vName: 'test',
  d_date: '2016-03-15 00:00:00',
  f_a: 0,
  f_b: 0,
  f_c: 0,
  f_d: 4,
  f_e: 0,
  f_f: 0.1,
  f_g: 0
}, {
  n_vId: 2,
  s_vName: 'test',
  d_date: '2016-03-15 00:15:00',
  f_a: 1,
  f_b: 1,
  f_c: 0,
  f_d: 4,
  f_e: 0,
  f_f: 0.1,
  f_g: 0
}];

function transform(letter) {
  return _.map(objs, function (obj) {
    var out = {
      date: obj.d_date
    };
    out[letter] = obj['f_' + letter];
    return out;
  });
}

var a = transform('a'),
    b = transform('b'); // etc.

document.getElementById('out').textContent = JSON.stringify({a: a, b: b}, true, '\t');
<script src="https://cdn.jsdelivr.net/lodash/4.6.1/lodash.min.js"></script>

<pre id="out"></pre>