我正在寻找从数组返回特定项的替代解决方案。
[
["chrome", "72"],
["chrome", "71"],
["chrome", "70"],
["edge", "18"],
["edge", "17"]
]如何返回每个浏览器的最老版本,例如[ [ "chrome", "70" ], [ "edge", "17" ] ]
我现在有一个chrome过滤器和一个edge过滤器等等,但是我不知道是否有一种更干净的方法来实现同样的结果。
发布于 2019-05-04 04:33:09
您可以使用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) })
, {}
)发布于 2019-05-04 04:40:47
您需要将这个数组reduce到一个对象中,其中每个键都是浏览器的名称,而值是最老的版本。一个简单的if语句检查哪个版本是旧版本就足够了。使用[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或其聚脂填充以创建所需的数组:
Object.entries({chrome: "70", edge: "17"});
// => [ [ "chrome", "70" ], [ "edge", "17" ] ]在评论中,您已经提到输入数组总是从最高到最低排序。在这种情况下,您可以使用Object.fromEntries或其多边形填充,并在一行中实现您的结果:
Object.entries(Object.fromEntries(browsers));
// => [ [ "chrome", "70" ], [ "edge", "17" ] ]fromEntries从上到下遍历输入数组,并将每个键值对分配给对象。带有重复键的条目将被覆盖,并且由于所需的版本位于底部,这正是您想要的。
如果所需的条目位于底部,则可以使用类似于Object.entries(Object.fromEntries(browsers.reverse()))的内容。否则,这一行将提供最新版本。
https://stackoverflow.com/questions/55979426
复制相似问题