javascript-基于分隔符结尾的字符串过滤器数组

时间:2020-03-16 22:00:35

标签: javascript arrays string sorting

我有一个这样的字符串数组:

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”版本)。 / p>

我的预期结果是:

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

有什么简单的方法吗?

4 个答案:

答案 0 :(得分:1)

您可以通过两个循环进行操作:第一个循环查找新循环,第二个循环较大的支票

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);

答案 1 :(得分:0)

您可以检查数组每个元素中字符串的最后一个索引中的值,如果它们符合最新条件,则将其放入新数组中。

答案 2 :(得分:0)

使用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));

答案 3 :(得分:0)

您可以使用一个对象来存储键/版本对,并最终转换为适当的输出。版本比较可以是在这里找到的任何版本:How to compare software version number using js? (only number)

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

相关问题