Как проверить, существует ли идентификатор в одном массиве объектов json в другом вложенном массиве объектов json? - PullRequest
0 голосов
/ 20 января 2019

Я звоню в две конечные точки и мне нужно показать все компании с их фондами, названием и фабрикой, которая производит для этой компании.

вот ответ от одной конечной точки

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 голосов
/ 20 января 2019

Вы можете сделать следующее, используя reduce и Map.

Получите 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)
0 голосов
/ 20 января 2019

Один из способов сделать это - создать карту идентификаторов компаний и идентификаторов фабрики, а затем просто выполнить итерацию по массиву компаний и добавить соответствующую фабрику к объекту компании, например:

Большим преимуществом этого является то, что ваш фабричный поиск будет 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);
0 голосов
/ 20 января 2019

Предполагая, что компания может иметь более одного завода.

Попробуйте следующее

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));
0 голосов
/ 20 января 2019

Попробуйте ... Это может помочь вам ...

    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);
    });
...