@genezis1111

Как правильно отсортировать массив js?

Здравствуйте!
Есть вот такой массив
["google.com|toster.ru|RU|120|222"],
["google.com|toster.ru|RU|120|222"],
["google.com|toster.ru|UA|120|222"],
["google.com|toster.ru|BG|120|222"],
["google.com|yandex.ru|IT|777|843"]

имеем 2 одинаковых элемента, 2 которые отличаются лишь Гео (ua и bg) и один не похожий совсем

Как отсортировать массив чтобы на выходе получить
["google.com|toster.ru|RU|120|222"],
["google.com|toster.ru|UA+BG|120|222"],
["google.com|yandex.ru|IT|777|843"]

Т.е удаляем повторы и объединяем гео (ua + bg)
  • Вопрос задан
  • 106 просмотров
Решения вопроса 2
RAX7
@RAX7
const arr= [
  ["google.com|toster.ru|RU|120|222"],
  ["google.com|toster.ru|RU|120|222"],
  ["google.com|toster.ru|UA|120|222"],
  ["google.com|toster.ru|BG|120|222"],
  ["google.com|yandex.ru|IT|777|843"]
];

const groupBy = 2;

const filtered = Array.from(new Set(arr.map(arr => arr[0])))
  .map(str => str.split('|'))
  .reduce((acc, curArr) => {
    const index = acc.findIndex(curAcc => {
      return !curAcc.some((curAccEl, i) => curAccEl !== curArr[i] && i !== groupBy);
    });

    if (index === -1) {
      acc.push(curArr);
    }
    else {
      acc[index][groupBy] += '+' + curArr[groupBy];
    }
    return acc;
  }, [])
  .map(arr => [arr.join('|')]);
Ответ написан
Комментировать
@StockholmSyndrome
const arr = [
  "google.com|toster.ru|RU|120|222",
  "google.com|toster.ru|RU|120|222",
  "google.com|toster.ru|UA|120|222",
  "google.com|toster.ru|BG|120|222",
  "google.com|yandex.ru|IT|777|843"
];


const result = arr.reduce((acc, curr) => {
  const [a, b, geo, c, id] = curr.split('|');
  const elem = acc.find(({value}) => value === id);
  if (elem) {
    if (!elem.items.includes(geo)) {
      elem.items.push(geo);
    }
  } else {
    acc.push({
      items: [geo], 
      elems: [a, b, c],
      value: id
    });
  }
  return acc;
}, []).map(({items, elems: [a, b, c], value}) => [a, b, items.join('+'), c, value].join('|'));
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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