【问题标题】:javascript - filter array of strings based on seperated endingjavascript - 基于单独的结尾过滤字符串数组
【发布时间】:2020-06-28 00:36:44
【问题描述】:

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

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"
];

我想过滤它们,以便只留下给定“作者:姓名”具有最新版本的那些,从而删除那些不是最新的(即“1.0.1”的)。

我的预期结果是这样的:

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

有什么方法可以简单地做到这一点?

【问题讨论】:

  • 排序意味着排序,你问的是过滤。
  • 帮助我们帮助您 - 请分享您期望得到的结果
  • 创建一个对象,其键是author:name 字符串。遍历数组,检查当前版本字符串是否高于该键的对象中已有的版本。如果是,请替换该值。完成后,您将拥有每个键的最高版本。
  • 我更新了我的帖子,试图让它更清晰。

标签: javascript arrays string sorting


【解决方案1】:

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

【讨论】:

  • 这个答案如果有例子支持会更好。
  • 在正确的单词上加上大写字母会更好,也许一两个逗号:)
【解决方案2】:

你可以用两个循环第一个找到新的第二个检查哪个更大

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

【讨论】:

  • x[2]&gt; arr[2] 是一种比较版本的简单方法,不会一直有效,例如 v1.11 与 v1.2。另外,您声明了isnew,但没有使用。
【解决方案3】:

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

【讨论】:

  • 而不是&gt; 应该是&lt;,它保持最小的数字。如果不同的作者具有相同的应用程序名称,您的代码也不起作用。还有 v1.11 > v2.0
  • @ariel,很好。我解决了这两个问题。谢谢你:)
【解决方案4】:

您可以使用对象来存储密钥/版本对,并在最后转换为适当的输出。版本比较可以是这里找到的任何一个: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

【讨论】:

    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 1970-01-01
    相关资源
    最近更新 更多