有什么想法可以从字符串数组中计算最小/最大吗?
var arr = ['aab','aac','aad','abx'];
到目前为止,我已经考虑根据最大/最小使用.sort()
函数,并获得结果的第一个元素。
但是也许您知道更好的预成型解决方案?
编辑:数组大小小于1k个元素。最小值/最大值是指字母排序:第一个和最后一个元素。
答案 0 :(得分:1)
以下是一些解决问题的方法:
基于长度的最小/最大
const output = arr.sort((a, b) => a.length - b.length);
最小/最大字母顺序
const output = arr.sort();
提取最小值和最大值
const max = arr.sort(() => 1)[0];
答案 1 :(得分:1)
遍历列表,并在每个迭代步骤中更新最小值和最大值
function getMinMax(arr) {
if (!arr) {
return null;
}
var minV = arr[0];
var maxV = arr[0];
for (a of arr) {
if (a < minV) minV = a;
if (a > maxV) maxV = a;
}
return [minV, maxV];
}
console.log(getMinMax(['abc', 'aaa', 'abb']));
对于大型数组,它应该比sort()
快得多。此算法为O(n),而sort()
至少为O(n log(n))。
答案 2 :(得分:1)
如果您不想使用排序,
另一种选择是使用Array.reduce
来保持min
和max
的值。
下面是显示此内容的有效代码段。
ps。您的测试数据已经将min作为第一个元素,并将max作为最后一个元素,因此我将示例数组更改为zzz
,当然是max
。
var arr = ['aab','aac','zzz','aad','abx'];
var ret = arr.reduce((a, v) => {
a.min = a.min === null ? v :
v.localeCompare(a.min) < 0 ? v : a.min;
a.max = a.max === null ? v :
v.localeCompare(a.max) > 0 ? v : a.max;
return a; },
{min: null, max: null});
console.log(ret);
答案 3 :(得分:0)
您可以一次性使用reduce,但必须检查数组为空时返回什么(当前的min和max都返回未定义)
const arr = [
'aab',
'aac',
'aad',
'abx',
];
console.log(
arr.reduce(
([min, max], item) => [
min.localeCompare(item) > 0
? item
: min,
max.localeCompare(item) < 0
? item
: max,
],
[arr[0], arr[0]],
),
);
答案 4 :(得分:0)
这就是我所做的(请注意,它会使原始数组发生变化):
const myArray = ['beta', 'alpha', 'zeta', 'delta'];
const min = myArray.sort()[0];
const max = myArray.sort().reverse()[0];
console.log({ min, max });