【问题标题】:Transform array of objects from one form to another with simple lodash/underscore functions使用简单的 lodash/underscore 函数将对象数组从一种形式转换为另一种形式
【发布时间】:2015-09-16 19:08:51
【问题描述】:

我有一个以下格式的 JavaScript 数组:

[{key: '123', data: ['a', 'b', 'c']}, {key:'234', data: ['b', 'c', 'd']}];

预期结果:

[{a: '123'}, {b:['123', '234'}, {c:['123', '234']}, {d:['234']}]

我尝试了groupBymapreduce 和其他几个 lodash 函数,但没有返回接近我需要的结果。

【问题讨论】:

  • 为什么要将它们作为一个数组而不是单个对象?
  • 这就是我需要发送到服务器的方式:)
  • 你试图做的事情的模式并不是真的在我身上跳出来。

标签: underscore.js lodash


【解决方案1】:

以下代码有效,但我不喜欢使用两个 for 循环。我确信有更好的方法来做到这一点。请提出建议。

var inputArr = [{key: '123', data: ['a', 'b', 'c']}, {key:'234', data: ['b', 'c', ' d']}];

var outputArr = [];
var tempObj = {};
angular.forEach(inputArr, function(obj) {
    var key = obj.key;
    angular.forEach(obj.data, function(data) {
        tempObj[data] = {'data': data, 'key': key};
    });
});
outputArr = _.map(tempObj, function(value, index){
  return {'data': index, 'key': value};
});

//[{a: '123'}, {b:['123', '234'}, {c:['123', '234']}, {d:['234']}]

【讨论】:

    【解决方案2】:

    只为 lulz =) :

    var t = [{key: '123', data: ['a', 'b', 'c']}, {key:'234', data: ['b', 'c', 'd']}];
    var r = {};
    var k = _.each(_.uniq([].concat.apply([], _.pluck(t, 'data'))), function(p){
        r[p] = _.pluck(_.filter(t, function(n){return n.data.indexOf(p) > -1}), 'key');
    });
    
    console.log(JSON.stringify(r));
    

    结果(作为对象):

    {"a":["123"],"b":["123","234"],"c":["123","234"],"d":["234"]}
    

    还有:

    var r = [];
    var k = _.each(_.uniq([].concat.apply([], _.pluck(t, 'data'))), function(p){
        var q = {};
        q[p] = _.pluck(_.filter(t, function(n){return n.data.indexOf(p) > -1}), 'key');
        r.push(q);
    });
    

    结果(作为数组):

    [{"a":["123"]},{"b":["123","234"]},{"c":["123","234"]},{"d":["234"]}]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多