SQL Имея, но Javascript способом - PullRequest
1 голос
/ 04 августа 2020

Итак, я подошел сюда в javascript, чтобы преобразовать SQL Query, но используя Javascript.

, следующий оператор SQL перечисляет количество клиентов в каждой стране. Включайте только страны с более чем 5 клиентами :

SELECT COUNT(CustomerID), Country
FROM Customers
GROUP BY Country
HAVING COUNT(CustomerID) > 5;

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

//my array
[
  {
    customerID: 1,
    CustomerName: "Alfreds Futterkiste",
    contactName: "Maria Anders",
    country: "Germany",
  },
  {
    customerID: 2,
    CustomerName: "Ana Trujillo Emparedados y helados",
    contactName: "Ana Trujillo",
    country: "Mexico",
  },
  {
    customerID: 3,
    CustomerName: " Antonio Moreno Taquería",
    contactName: "Antonio Mereno Jr.",
    country: "Mexico",
  },
];

//expected output
[
  {
    country: "Mexico",
    count: 2
  },
  {
    country: "Germany",
    count: 1
  },
]

Мы можем использовать loda sh или любую другую библиотеку для решения этой

Ответы [ 2 ]

3 голосов
/ 04 августа 2020

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

Как только мы получим это , мы можем использовать Object.values, чтобы снова превратить нашу карту в массив.

Если мы используем sh для фильтрации по свойству count, мы можем затем выполнить Array.filter на данные результата.

Loda sh имеет функцию groupBy , которая будет делать то же самое.

const data = [{
    customerID: 1,
    CustomerName: "Alfreds Futterkiste",
    contactName: "Maria Anders",
    country: "Germany",
  },
  {
    customerID: 2,
    CustomerName: "Ana Trujillo Emparedados y helados",
    contactName: "Ana Trujillo",
    country: "Mexico",
  },
  {
    customerID: 3,
    CustomerName: " Antonio Moreno Taquería",
    contactName: "Antonio Mereno Jr.",
    country: "Mexico",
  },
];

const result = Object.values(data.reduce((map, customer) => {
  if (!map[customer.country]) {
    map[customer.country] = {
      country: customer.country,
      count: 0
    }
  }
  map[customer.country].count++;
  return map;
}, {}));


console.log("All results: ", result);

const countThreshold = 2;

console.log("Filtered by count (" + countThreshold + "): ", result.filter(r => r.count >= countThreshold));
1 голос
/ 04 августа 2020

Попробуйте это простое решение для ваших требований.

var arr = [{
    customerID: 1,
    CustomerName: "Alfreds Futterkiste",
    contactName: "Maria Anders",
    country: "Germany",
  },
  {
    customerID: 2,
    CustomerName: "Ana Trujillo Emparedados y helados",
    contactName: "Ana Trujillo",
    country: "Mexico",
  },
  {
    customerID: 3,
    CustomerName: " Antonio Moreno Taquería",
    contactName: "Antonio Mereno Jr.",
    country: "Mexico",
  },
];

var countryCount = {};
arr.forEach(element => {
  countryCount[element.country] = countryCount[element.country] ? ++countryCount[element.country] : 1;
});


var output = Object.keys(countryCount).map(key => ({
  country: key,
  count: countryCount[key]
}));

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