Как проверить, существует ли идентификатор в одном массиве объектов json в другом вложенном массиве объектов json?

Вы распаковываете из списка for for цикл и создаете 3 переменные name, appt и salary. С помощью этих переменных невозможно легко изменить структуру data. Вам нужно извлечь список из data и получить доступ к нему путем индексирования:

from pprint import pprint

data = [['Ben', 'Manager', 3000],
           ['James', 'Cleaner', 1000],
           ['Ken', 'Supervisor', 2000]]

for d in data:
    if d[0] == 'James':
        d[2] = 1500
        print(d)  # prints only changed row

pprint(data)  # prints whole structure

Печать:

['James', 'Cleaner', 1500]
[['Ben', 'Manager', 3000],
 ['James', 'Cleaner', 1500],
 ['Ken', 'Supervisor', 2000]]
0
задан jdip88 20 January 2019 в 01:50
поделиться

3 ответа

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

Большое преимущество это то, что ваши фабричные поиски будут 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
ответ дан mhodges 20 January 2019 в 01:50
поделиться

Вы можете сделать следующее, используя 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
ответ дан adiga 20 January 2019 в 01:50
поделиться

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

    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);
    });
0
ответ дан MAREESKANNNAN R 20 January 2019 в 01:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: