как отфильтровать дубликаты по длине значения свойства - PullRequest
0 голосов
/ 16 апреля 2020

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

const DATA = [
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "WAYZETTA 67-2536H",
    "entityId": 31135395,
    "selectedColumn": "Mar",
    "selectedColumns": "Mar"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  }
]

const DESIRED_RESULT = [
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Jan",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "MARYS DRAW 461-2227H",
    "entityId": 31340479,
    "selectedColumn": "Feb",
    "selectedColumns": "Jan Feb"
  },
  {
    "wellName": "WAYZETTA 67-2536H",
    "entityId": 31135395,
    "selectedColumn": "Mar",
    "selectedColumns": "Mar"
  }
]

Я дал желаемый результат. Каждое имя скважины, такое как MARYS DRAW 461-2227H, будет иметь свойство selectedColumns со строкой месяцев. Мне нужно ограничить количество дубликатов тем же количеством месяцев, а также для каждого дубликата должен быть установлен один из трех месяцев в качестве selectedColumn.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2020

Это может быть то, что вы ищете:

let result = [];
let filter = {};
let col, cols;

// Iterate through every element
data.forEach(datum => {
  col = datum.selectedColumn;
  cols = datum.selectedColumns;
  // Add selectedColumns value if not already tracked
  if (!filter[cols]) {
    filter[cols] = [];
  }
  // Make sure element with same selectedColumn value doesn't already exist
  if (filter[cols].indexOf(col) === -1) {
    filter[cols].push(col);
    result.push(datum);
  }
})

По сути, он отслеживает найденные значения selectedColumns, затем сопоставляет каждое из них с массивом, хранящим значения selectedColumn и проверяя, что они не ' т дублируется в результате.

1 голос
/ 17 апреля 2020

Одним из способов решения таких проблем является временное сворачивание моего списка в объект с ключами, состоящими из важных частей объекта, и значениями (в данном случае), являющимися существующим результатом, если он есть, или текущим. Это просто reduce Тогда я просто беру значения этого объекта, игнорируя ключи, используя Object .values.

Вот один из подходов:

const dedupe = data => Object .values (data .reduce ((
  a, entry, _, __, 
  key = `${entry .entityId} | ${entry .selectedColumn} | ${entry .selectedColumns}`
) => ({...a, [key]: a [key] || entry}), {}))

const DATA = [{wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "WAYZETTA 67-2536H", entityId: 31135395, selectedColumn: "Mar", selectedColumns: "Mar"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Jan", selectedColumns: "Jan Feb"}, {wellName: "MARYS DRAW 461-2227H", entityId: 31340479, selectedColumn: "Feb", selectedColumns: "Jan Feb"}];

console .log (dedupe (DATA))

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

Единственный немного хитрый бит в этом коде - это присвоение key внутри параметров для reduce. Мне нравится этот подход, поскольку он делает мое тело функции единым выражением. Но здесь, в обратном вызове reduce, это немного неловко из-за третьего и четвертого аргументов (индекс и массив), которые reduce предоставляет вам. Я просто игнорирую их, предоставляя неиспользуемые параметры _ и __. Но это могут быть i и arr или что-то еще.

...