Как я могу рассчитывать пользователей, использующих только одного поставщика? - PullRequest
1 голос
/ 22 июня 2019

Здравствуйте, я практикуюсь и пытаюсь составить список достоверности для некоторых поставщиков услуг, поэтому мне нужен такой объект:

object = {
   providerName: NumberOfUsersWithServiceOnly 
   providerName: NumberOfUsersWithServiceOnly
   providerName: NumberOfUsersWithServiceOnly
   providerName: NumberOfUsersWithServiceOnly
}

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

Пока у меня есть только эти массивы:

const services = [
    { userid: 1, providerId: 1, balance: 250000 },
    { userid: 4, providerId: 3, balance: 280900 },
    { userid: 6, providerId: 3, balance: 31000 },
    { userid: 2, providerId: 2, balance: 58600 },
    { userid: 3, providerId: 1, balance: 13000 },
    { userid: 5, providerId: 2, balance: 5000 },
    { userid: 3, providerId: 3, balance: 59900 },
    { userid: 7, providerId: 3, balance: 9500 },
    { userid: 7, providerId: 2, balance: 9500 },
    { userid: 4, providerId: 1, balance: 9500 },
    { userid: 6, providerId: 3, balance: 9500 },
    { userid: 2, providerId: 2, balance: 9500 }
]

const providers = [
    { id: 1, name: Netflix },
    { id: 2, name: Comcast },
    { id: 3, name: Verizon }
]

let result= {};
    providers.forEach(provider=> {
       result[provider.name] = [];
})

В этом примере вывод, который я ищу, будет:

result = {
    Netflix: 1, // only 1 user has only this service
    Comcast: 3, // only 1 user has only this service
    Verizon: 2, // 3 users have only this service
}

Ответы [ 2 ]

1 голос
/ 23 июня 2019

Вы можете сначала создать объект, который отслеживает, сколько сервисов подписал пользователь. Затем, используя это сопоставление, вы можете рассчитать, сколько пользователей у каждой службы подписаны только на эту службу.

const services = [
    { userid: 1, providerId: 1, balance: 250000 },
    { userid: 4, providerId: 3, balance: 280900 },
    { userid: 6, providerId: 3, balance: 31000 },
    { userid: 2, providerId: 2, balance: 58600 },
    { userid: 3, providerId: 1, balance: 13000 },
    { userid: 5, providerId: 2, balance: 5000 },
    { userid: 3, providerId: 3, balance: 59900 },
    { userid: 7, providerId: 3, balance: 9500 },
    { userid: 7, providerId: 2, balance: 9500 },
    { userid: 4, providerId: 1, balance: 9500 },
    { userid: 6, providerId: 3, balance: 9500 },
    { userid: 2, providerId: 2, balance: 9500 }
];

const providers = [
    { id: 1, name: "Netflix" },
    { id: 2, name: "Comcast" },
    { id: 3, name: "Verizon" }
];

const userServiceCount = services.reduce((acc, curr) => {
  acc[curr.userid] = acc[curr.userid] || new Set();
  acc[curr.userid].add(curr.providerId);
  return acc;
}, {});
// Object.entries(userServiceCount).forEach(([k, v]) => console.log(k, Array.from(v)));

const result = providers.reduce((acc, {id, name}) => {
  acc[name] = Object.values(userServiceCount).filter(s => s.has(id) && s.size === 1).length
  return acc;
}, {});
console.log(result);
1 голос
/ 22 июня 2019

Попробуйте это:

  const services = [
        { userid: 1, providerId: 1, amount: 250000 },
        { userid: 4, providerId: 3, amount: 280900 },
        { userid: 6, providerId: 3, amount: 31000 },
        { userid: 2, providerId: 2, amount: 58600 },
        { userid: 3, providerId: 1, amount: 13000 },
        { userid: 5, providerId: 2, amount: 5000 },
        { userid: 3, providerId: 3, amount: 59900 },
        { userid: 7, providerId: 3, amount: 9500 }
    ]

    const providers = [
        { id: 1, name: "Netflix" },
        { id: 2, name: "Comcast" },
        { id: 3, name: "Verizon" }
    ]

    const result = providers.reduce((a,res) => ( a[res.name] = services.filter(ele => ele.providerId === res.id).length - 1, a), {});

     
    console.log(result)
     
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...