javascript - фильтровать массив строк на основе разделенного окончания - PullRequest
5 голосов
/ 17 марта 2020

У меня есть массив строк, подобных этому:

const strings = [
  "author:app:1.0.0",
  "author:app:1.0.1",
  "author:app2:1.0.0",
  "author:app2:1.0.2",
  "author:app3:1.0.1"
];

И я хочу отфильтровать их так, чтобы остались только те, которые имеют последние версии для данного «author: name», удалив таким образом те, которые не самые последние (то есть "1.0.1").

Мой ожидаемый результат таков:

const filteredStrings = [
  "author:app:1.0.1",
  "author:app2:1.0.2",
  "author:app3:1.0.1"
];

Любой способ сделать это просто?

Ответы [ 4 ]

1 голос
/ 17 марта 2020

Вы можете сделать это с двумя циклами: первый найти новые, второй проверить больше

const strings = [
  "author:app:1.0.0",
  "author:app:1.0.1",
  "author:app2:1.0.0",
  "author:app2:1.0.2",
  "author:app3:1.0.1"
];
filteredones = [];
strings.forEach(element => {
  var arr = element.split(":");
  var isnew = true;
  var found = filteredones.find(function(element2) {
    var x = element2.split(":");
    return x[1] == arr[1] && x[0] == arr[0]
  });
  if (found == undefined) {
    filteredones.push(element);
  }
});
for (var i = 0; i < filteredones.length; i++) {
  element = filteredones[i];
  var arr = element.split(":");
  var isnew = true;
  var found = strings.find(function(element2) {
    var x = element2.split(":");
    return x[1] == arr[1] && x[0] == arr[0] && x[2] > arr[2]
  });
  if (found != undefined) {
    filteredones[i] = found;
  }
};

console.log(filteredones);
0 голосов
/ 17 марта 2020

Вы можете использовать объект для хранения пар ключ / версия и конвертировать в соответствующий вывод в конце. Сравнение версий может быть любым из найденных здесь: Как сравнить номер версии программного обеспечения, используя js? (только номер)

result = {};
for (var s of input) {
  // parts = ["author", "appname", "version"]
  var parts = s.split(":");
  var i = parts[0] + ":" + parts[1];
  if (!result[i] || compareVersion(parts[2], result[i]))
    // If not present or version is greater
    result[i] = parts[2]; // Add to result
}
result = Object.keys(result).map(k => k + ":" + result[k])

Рабочая демоверсия: https://codepen.io/bortao/pen/LYVmagK

0 голосов
/ 17 марта 2020

Создание объекта с keys в качестве имени приложения.
getValue Метод рассчитать значение версии, чтобы сравнить.
Обновить значение объекта, когда вы видите, что версия является последней (значение большое).

const strings = [
  "author:app:1.0.0",
  "author:app:1.0.1",
  "author:app2:1.0.0",
  "author:app2:1.0.2",
  "author:app3:1.0.1"
];

const filter = data => {
  const res = {};
  const getValue = item =>
    item
      .split(":")[2]
      .split(".")
      .reduceRight((acc, curr, i) => acc + curr * Math.pow(10, i), 0);
  data.forEach(item => {
    const app = item
      .split(":")
      .slice(0, 2)
      .join(":");
    if (!res[app] || (app in res && getValue(item) > getValue(res[app]))) {
      res[app] = item;
    }
  });
  return Object.values(res);
};

console.log(filter(strings));
0 голосов
/ 17 марта 2020

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

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