[英]How to check if an id in one array of json objects exists in another nested array of json objects?
我打電話給兩個端點,需要顯示所有公司及其資金,名稱和為該公司生產的工廠。
這是一個終點的回應
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"
}
];
試試看...。這可能對您有幫助...
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);
});
獲取company-id
和factory-name
Map->然后遍歷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)
一種方法是創建公司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);
假設一家公司可以擁有多個工廠。
嘗試以下
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));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.