如何在浏览器版本对数组中找到最小的版本号?

时间:2019-05-04 04:24:21

标签: javascript arrays

我正在寻找用于从阵列中返回特定项目的替代解决方案。

[
  ["chrome", "72"],
  ["chrome", "71"],
  ["chrome", "70"],
  ["edge", "18"],
  ["edge", "17"]
]

如何返回每个浏览器的最旧版本,例如[ [ "chrome", "70" ], [ "edge", "17" ] ]

我目前有一个针对chrome的过滤器和一个edge的过滤器,依此类推。但是我想知道是否有一种更干净的方法来实现相同的结果。

2 个答案:

答案 0 :(得分:2)

您可以使用reducemin

const data = 
  [ ["chrome", "72"]
  , ["chrome", "71"]
  , ["chrome", "70"]
  , ["edge", "18"]
  , ["edge", "17"]
  ]

const result = 
  data.reduce
    ( (acc, [ browser, version ]) =>
        ({ ...acc, [browser]: Math.min(version, acc[browser] || Infinity) })
    , {}
    )
    
console.log(result)
// { "chrome": 70
// , "edge": 17
// }

console.log(Object.entries(result))
// [ [ "chrome", 70 ]
// , [ "edge", 17 ]
// ]

如果要使用最新版本,请改用max-

const result = 
  data.reduce
    ( (acc, [ browser, version ]) =>
        ({ ...acc, [browser]: Math.max(version, acc[browser] || 0) })
    , {}
    )

答案 1 :(得分:-1)

您需要将此数组reduce放入一个对象,其中每个键是浏览器的名称,而值是最早的版本。一个简单的if语句检查哪个版本更早就足够了。使用destructuring for [browser, version]使事情变得更简单:

const browsers = [
  ["chrome", "72"],
  ["chrome", "71"],
  ["chrome", "70"],
  ["edge", "18"],
  ["edge", "17"]
];

browsers.reduce((oldest, [browser, version]) => {
  if(!oldest.hasOwnProperty(browser) || Number(oldest[browser]) > Number(version)){
    oldest[browser] = version;
  }

  return oldest;
}, {});

此时,您将获得以下结构:{chrome: "70", edge: "17"}。可以将其传递给Object.entries或其polyfill来创建所需的数组:

Object.entries({chrome: "70", edge: "17"});
// => [ [ "chrome", "70" ], [ "edge", "17" ] ]

comment中,您提到输入数组将始终从最高到最低排序。在这种情况下,您可以使用Object.fromEntries或其polyfill并在一行中获得结果:

Object.entries(Object.fromEntries(browsers));
// => [ [ "chrome", "70" ], [ "edge", "17" ] ]

fromEntries从上至下遍历输入数组,并将每个键值对分配给一个对象。包含重复键的条目将被覆盖,并且由于所需的版本位于底部,因此正是您想要的。

如果所需的条目位于底部,则可以使用诸如Object.entries(Object.fromEntries(browsers.reverse()))之类的东西。否则,此行会为您提供最新版本。