我正在寻找用于从阵列中返回特定项目的替代解决方案。
[
["chrome", "72"],
["chrome", "71"],
["chrome", "70"],
["edge", "18"],
["edge", "17"]
]
如何返回每个浏览器的最旧版本,例如[ [ "chrome", "70" ], [ "edge", "17" ] ]
?
我目前有一个针对chrome
的过滤器和一个edge
的过滤器,依此类推。但是我想知道是否有一种更干净的方法来实现相同的结果。
答案 0 :(得分:2)
您可以使用reduce
和min
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()))
之类的东西。否则,此行会为您提供最新版本。