使用下划线js按嵌套数组项拼合数组

Using underscorejs to flattern array by nested array item

我有对象数组,每个对象都有列表,每个嵌套列表包含 1 和 2。

[{
    "name":"a",
    "companies":[1,2]
},
{
    "name":"b",
    "companies":[1,2]
},
{
    "name":"c",
    "companies":[1,2]
}]

我想像这样通过 underscorejs 创建复制列表:

[{
    "name":"a",
    "company":1
},
{
    "name":"a",
    "company":2
},
{
    "name":"b",
    "company":1
},
{ 
    "name":"b",
    "company":2
},
{
    "name":"c",
    "company":1
},
{
    "name":"c",
    "company":2
}]

如何才能做到?

您也可以在没有 underscore.js 的情况下执行此操作。以下为纯js版:

var data = [{
    "name":"a",
    "companies":[1,2]
},
{
    "name":"b",
    "companies":[1,2]
},
{
    "name":"c",
    "companies":[1,2]
}];

var result = [];
data.forEach(function(item){
  item.companies.forEach(function(company){
    result.push({"name": item.name, "company": company});
  });
});

console.log(result);

下面是我尝试使用下划线的方式。

function makeCompany(name) {
  return function (company) {
    return { name: name, companies: company };
  }
}

function splitCompany(obj) {
  return _.map(obj.companies, makeCompany(obj.name));
}

对于数组中的每个对象,使用 splitCompany 根据 companies 数据创建和 return 两个对象,然后展平 returned 数组。

var result = _.flatten(_.map(arr, splitCompany));

DEMO