使用lodash或vanila js将不同的数组转换为对象数组

时间:2017-12-06 12:37:16

标签: javascript angularjs lodash

我有不同的相同大小的数组:

var a = ["x", "y", "z"];
var b = [1,2,3];
var c = ["l", "m", "n"];

我希望将其转换为这样的对象数组:

final_array = [{a: 'x', b: 1, c: 'l'}, {a: 'y', b: 2, c: 'm'}, {a: 'z', b: 3, c: 'n'}]

我知道我可以使用循环处理数组,并以某种方式将其转换为上述格式。我尝试过这种方式(因为所有数组的大小都相同):

var final_array = [];
_.forEach(a, function(value, key){
  var each_list = {};
  each_list.a = a[key];
  each_list.b = b[key];
  each_list.c = c[key];
  final_array[key] = each_list;
})
console.log(final_array); // [{a: 'x', b: 1, c: 'l'}, {a: 'y', b: 2, c: 'm'}, {a: 'z', b: 3, c: 'n'}]

但这似乎是一种非常漫长的方式,我相信使用lodash或其他方法会有一些好方法。

任何人都可以帮助我。我已经对堆栈溢出和lodash文档进行了足够的搜索,但是找不到更好的方法。

2 个答案:

答案 0 :(得分:3)

这应该有效:

_.zipWith(a, b, c, function(a, b, c) {
  return { a: a, b: b, c: c };
});

或者,如果您可以使用ES6,那么:

_.zipWith(a, b, c, (a, b, c) => ({ a, b, c }) );

答案 1 :(得分:1)

在普通的ES6中,您可以使用short hand properties的对象并迭代键和数组的项目。

var a = ["x", "y", "z"],
    b = [1, 2, 3],
    c = ["l", "m", "n"],
    object = { a, b, c },
    result = Object.keys(object).reduce(function (r, k) {
        object[k].forEach((v, i) => (r[i] = r[i] || {})[k] = v);
        return r;
    }, []);
    
console.log(result);