如何检查一个json对象数组中的id是否存在于另一个嵌套的json对象数组中?

时间:2019-01-20 01:22:11

标签: javascript arrays json object lodash

我正在致电两个端点,需要显示所有公司及其资金,名称和为该公司生产的工厂。

这是一个端点的响应

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"
    }
];

4 个答案:

答案 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)

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

获取company-idfactory-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));