Как проверить, что массив взаимно равен? - PullRequest
0 голосов
/ 17 декабря 2018

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

[{ types: ['a', 'b'], indexes: ['i0', 'i1']}, { types: ['c', 'd'], indexes: ['i2', 'i3']}, ...]

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

Проблема в том, что в настоящее время он только проверяет, содержит ли элемент все типы и индексы, присутствующие в уникальных парах.Так что если есть пара с типами: a, b, c;он будет соответствовать любому, содержащему любую комбинацию этих трех, а не только этих трех.

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

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

EDIT :

Итак, существующий код:

const distinctIndexTypes =
  _.uniqWith(
    Object.values(items).map(item => { indexes: item.indexes, types: item.types }),
    _.isEqual,
  );

const queries = [];
distinctIndexTypes.forEach(indexType => {
  const aggs = [];
  Object.values(items).forEach(item => {
    if (
      indexType.indexes.every(index => item.indexes.includes(index)) &&
      item.indexes.every(index => indexType.indexes.includes(index)) &&
      item.types.every(type => indexType.types.includes(type)) &&
      indexType.types.every(type => item.types.includes(type))
    ) {
      aggs.push(item);
    }
  });

  if (aggs.length > 0) {
    queries.push({
      aggs,
    });
  }
});

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

1 Ответ

0 голосов
/ 24 декабря 2018

Как насчет группировки по форматированному ключу?

var groups = _.groupBy(items, item => _.sortBy(item.types) + ";" + _.sortBy(item.indexes))
var queries2 = _.map(groups, g => { return { aggs: g }; })
...