将数组缩减为第一个和最后一个元素的元组?
Reduce array to tuple of first and last element?
我有一个数组,我想先排序,然后 return 排序数组的第一个和最后一个元素。我以为我可以使用reduce
,但是如果我没有初始值怎么办?
这是我尝试使用的数组:
let myNumbers = [4, 9, 6, 2, 3]
怎么才能map
this到排序数组的第一个和最后一个到this?:
(2, 9)
reduce 不需要初始值,它是可选的。
var foo = [1, 40, 20, -20, 50];
var reducer = function(prev, curr, i, arr){return [prev[0] <= curr ? prev[0] : curr, prev[1] >= curr ? prev[1] : curr]};
var baz = foo.reduce(reducer); // [-20, 50]
或者像这样:
var foo = [1, 40, 20, -20, 50];
var reducer = function(prev, curr, i, arr){return {min: prev.min <= curr ? prev.min : curr, max: prev.max >= curr ? prev.max : curr}};
var baz = foo.reduce(reducer); // {min: -20, max: 50}
编辑:刚刚注意到这是针对 swift 而不是 javascript,哎呀,哈哈。我一定是浏览了错误的 SO 类别。我认为原则在 swift 中是相同的,除了你可能确实需要提供某种初始值。
方法一:min()
/max()
这是最简单的方法:
let input = [4, 9, 6, 2, 3]
let output = (input.min(), input.max())
print(output) //(Optional(2), Optional(9))
如果您确定数组不为空,您可以安全地强制解包可选值:
let input = [4, 9, 6, 2, 3]
let output = (input.min()!, input.max()!) // (2, 9)
这是对数组进行 2 次迭代的方法。是 O(N)
。除非其他地方需要排序列表,否则排序然后取 first/last 会更糟,因为它会是 O(N * log_2(N))
.
方法二:reduce()
如果你坚持使用reduce,你可以这样做:
let input = [4, 9, 6, 2, 3]
let output = input.reduce((min: Int.max, max: Int.min)){
(min([=12=].min, ), max([=12=].max , ))
} //(2, 9)
每次 reduce 迭代都会将累加器设置为新的最小值(旧最小值和当前元素中的较小者)和新最大值(旧最大值和当前元素中的较大者)。
累加器的初始值设置为:
- 数组中的任何元素比较小于累加器的最小值
- 数组中的任何元素比较大于累加器的最大值
我有一个数组,我想先排序,然后 return 排序数组的第一个和最后一个元素。我以为我可以使用reduce
,但是如果我没有初始值怎么办?
这是我尝试使用的数组:
let myNumbers = [4, 9, 6, 2, 3]
怎么才能map
this到排序数组的第一个和最后一个到this?:
(2, 9)
reduce 不需要初始值,它是可选的。
var foo = [1, 40, 20, -20, 50];
var reducer = function(prev, curr, i, arr){return [prev[0] <= curr ? prev[0] : curr, prev[1] >= curr ? prev[1] : curr]};
var baz = foo.reduce(reducer); // [-20, 50]
或者像这样:
var foo = [1, 40, 20, -20, 50];
var reducer = function(prev, curr, i, arr){return {min: prev.min <= curr ? prev.min : curr, max: prev.max >= curr ? prev.max : curr}};
var baz = foo.reduce(reducer); // {min: -20, max: 50}
编辑:刚刚注意到这是针对 swift 而不是 javascript,哎呀,哈哈。我一定是浏览了错误的 SO 类别。我认为原则在 swift 中是相同的,除了你可能确实需要提供某种初始值。
方法一:min()
/max()
这是最简单的方法:
let input = [4, 9, 6, 2, 3]
let output = (input.min(), input.max())
print(output) //(Optional(2), Optional(9))
如果您确定数组不为空,您可以安全地强制解包可选值:
let input = [4, 9, 6, 2, 3]
let output = (input.min()!, input.max()!) // (2, 9)
这是对数组进行 2 次迭代的方法。是 O(N)
。除非其他地方需要排序列表,否则排序然后取 first/last 会更糟,因为它会是 O(N * log_2(N))
.
方法二:reduce()
如果你坚持使用reduce,你可以这样做:
let input = [4, 9, 6, 2, 3]
let output = input.reduce((min: Int.max, max: Int.min)){
(min([=12=].min, ), max([=12=].max , ))
} //(2, 9)
每次 reduce 迭代都会将累加器设置为新的最小值(旧最小值和当前元素中的较小者)和新最大值(旧最大值和当前元素中的较大者)。
累加器的初始值设置为:
- 数组中的任何元素比较小于累加器的最小值
- 数组中的任何元素比较大于累加器的最大值