簡體   English   中英

如何檢查一個json對象數組中的id是否存在於另一個嵌套的json對象數組中?

[英]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);
    });

您可以使用reduceMap進行以下操作。

獲取company-idfactory-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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM