javascript - 从数组中获取具有最高优先级的字符串的最有效方法

标签 javascript arrays string ecmascript-6 comparison

假设我有一个数组,如下所示:

var numArray = [ 1, 2, 1, 2, 1, 1, 3, 2, 1, 3 ];

我可以通过使用以下方法轻松获得最大值(value):

Math.max.apply(Math, array);

但是如果我有一个如下数组怎么办:

var stringArray = [ "Foo", "Very Foo", "Not So Foo", 
                    "Foo", "Very Foo", "Extremely Foo" ];

那么,从中获得最大值(value)的最有效方法是什么,最大值(value)是,按照重要性顺序:“Extremely Foo”>“Very Foo”>“Foo”>“Not So Foo”

首先想到的是使用循环迭代数组并手动进行比较:

var maxValue = "";
for(var i = 0; i < stringArray.length; i++) {
    if(maxValue != "Extremely Foo") {
        if(maxValue != "Very Foo") {
            if(maxValue != "Foo") {
                maxValue = stringArray[i];
            }
            else if(stringArray[i] != "Not So Foo") {
                maxValue = stringArray[i];
            }
        }
        else if(stringArray[i] == "Extremely Foo") {
            maxValue = stringArray[i];
            break;
        }
    }
    else { break; }
}

然后我考虑创建一个枚举来为每个不同的字符串赋予一个值:

enum Foos {
    Not So Foo = 0,
    Foo = 1,
    Very Foo = 2,
    Extremely Foo = 3,
}

并使用枚举值作为比较方法来代替使用大于逻辑运算符。

我的问题是:实现我想要实现的目标的最佳方法是什么?我提到的两种方法之一或者是否有其他更有效的 JavaScript 方法?

最佳答案

您可以使用 Array#reduce,并在每次迭代时采用枚举中具有最高值的字符串:

var foosEnum = { "Not So Foo": 0, "Foo": 1, "Very Foo": 2, "Extremely Foo": 3 };
var stringArray = [ "Foo", "Very Foo", "Not So Foo", "Foo", "Very Foo", "Extremely Foo" ];
                    
var result = stringArray.reduce(function(c, n) {
  return foosEnum[c] > foosEnum[n] ? c : n;
});

console.log(result);

关于javascript - 从数组中获取具有最高优先级的字符串的最有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45574811/

相关文章:

javascript - 通过输入改变立方体旋转速度(threejs)

javascript - replaceState 为空字符串 : Javascript

javascript - 如何将动态范围变量添加到angularjs中的for循环?

objective-c - 检查 NSString 的平衡分隔符

javascript - 输入/ radio 底部调整大小

javascript - AngularJs $http post 在操作钩子(Hook)之前

python - 如何使用 numpy.frompyfunc 返回元素数组而不是数组数组?

java - 二维数组除法代码错误?

c# - 将列表转换为小字符串

c - 字符串、获取和执行