我正在致电两个端点,需要显示所有公司及其资金,名称和为该公司生产的工厂。
这是一个端点的响应
let factories = [
{
id: 1,
name: "Xintang",
short: "xin",
companies: [0, 4, 101,198]
},
{
id: 2,
name: "Ohio Plant",
short: "OHP",
companies: [22, 27]
},
{
id: 3,
name: "Cincy",
short: "Cin",
companies: []
}
];
这是第二个回应
let companies = [
{
id: 0,
fund: "79588.96",
name: "Microsoft"
},
{
id: 1,
fund: "166727.06",
name: "Comcast"
},
{
id: 2,
fund: "131206.88",
name: "Apple"
},
{
id: 3,
fund: "74095.75",
name: "HP"
},
{
id: 4,
fund: "142556.86",
name: "Dell"
}
];
数据集要大得多,但这只是一个示例。因此,我希望能够创建一个将工厂与特定公司链接的新对象。有没有办法我可以map
管理公司,并检查哪个工厂的嵌套数组中有公司id
,以便可以向公司添加新属性factory
,并拥有一个看起来像这样的新对象数组。
let returnedArr = [
{
id: 0,
fund: "79588.96",
name: "Microsoft",
factory: "Xintang"
},
{
id: 4,
fund: "142556.86",
name: "Dell",
factory: "Xintang"
}
];
答案 0 :(得分:1)
尝试一下...。这可能对您有帮助...
let result = [];
companies.forEach(company => {
let tempCompany = {...company};
factories.forEach(factory => {
let tempArray = factory.companies.filter(item => item === company.id);
if(tempArray.length > 0) {
tempCompany.factory = factory.name;
}
});
result.push(tempCompany);
});
答案 1 :(得分:1)
获取company-id
和factory-name
映射->然后遍历companies
并创建输出
let factories = [{id:1,name:"Xintang",short:"xin",companies:[0,4,101,198]},{id:2,name:"Ohio Plant",short:"OHP",companies:[22,27]},{id:3,name:"Cincy",short:"Cin",companies:[]}],
companies = [{id:0,fund:"79588.96",name:"Microsoft"},{id:1,fund:"166727.06",name:"Comcast"},{id:2,fund:"131206.88",name:"Apple"},{id:3,fund:"74095.75",name:"HP"},{id:4,fund:"142556.86",name:"Dell"}]
/*Get the company id: factory name mapping*/
const map = factories.reduce((m, f) =>
(f.companies.forEach(c => m.set(c, f.name)), m)
, new Map);
const output = companies.map(c => ({...c, factory: map.get(c.id) || ''}));
console.log(output)
答案 2 :(得分:0)
执行此操作的一种方法是创建公司ID到工厂ID的映射,然后仅遍历company数组并将相应的工厂添加到company对象,如下所示:
此方法的最大优点是您的工厂标识查询将为O(1)
,并且要构建地图为O(n)
。您的整个算法将为O(n)
。即使对于非常大的数据集,这也使此过程非常快。
let factories = [
{
id: 1,
name: "Xintang",
short: "xin",
companies: [0, 4, 101,198]
},
{
id: 2,
name: "Ohio Plant",
short: "OHP",
companies: [22, 27]
},
{
id: 3,
name: "Cincy",
short: "Cin",
companies: []
}
];
let companies = [
{
id: 0,
fund: "79588.96",
name: "Microsoft"
},
{
id: 1,
fund: "166727.06",
name: "Comcast"
},
{
id: 2,
fund: "131206.88",
name: "Apple"
},
{
id: 3,
fund: "74095.75",
name: "HP"
},
{
id: 4,
fund: "142556.86",
name: "Dell"
}
];
var factoryMap = factories.reduce((res, curr) => {
return Object.assign(res, curr.companies.reduce((_res, _curr) => (_res[_curr] = curr.name, res), {}))
}, {});
var mappedCompanies = companies.map(company => Object.assign(company, {factory: factoryMap[company.id] || ""}));
console.log(mappedCompanies);
答案 3 :(得分:0)
假设一家公司可以拥有多个工厂。
尝试以下
let factories = [{
id: 1,
name: "Xintang",
short: "xin",
companies: [0, 4, 101, 198]
},
{
id: 2,
name: "Ohio Plant",
short: "OHP",
companies: [22, 27]
},
{
id: 3,
name: "Cincy",
short: "Cin",
companies: []
}
];
let companies = [{
id: 0,
fund: "79588.96",
name: "Microsoft"
},
{
id: 1,
fund: "166727.06",
name: "Comcast"
},
{
id: 2,
fund: "131206.88",
name: "Apple"
},
{
id: 3,
fund: "74095.75",
name: "HP"
},
{
id: 4,
fund: "142556.86",
name: "Dell"
}
];
let returnedArr = companies.map(company => {
company.factories = factories
.filter(factory => factory.companies.includes(company.id))
.map(factory => factory.name);
return company;
});
console.log(JSON.stringify(returnedArr, null, 4));