从阵列中获取具有最高优先级的字符串的最有效方法

时间:2017-08-08 17:42:26

标签: javascript arrays string ecmascript-6 comparison

我们说我有一个数组如下:

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

我可以通过使用:

轻松获得最大值
Math.max.apply(Math, array);

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

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

那么从最重要的价值中获取最大价值的最有效方法是什么,最重要的是按重要性排序:"极端Foo" > "非常好" > "富" > "不那么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中采用不同的方式更有效?

5 个答案:

答案 0 :(得分:1)

您可以使用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);

答案 1 :(得分:1)

如果你有一个fooportance数组,你可以创建一个fooness函数来确定foos数组中最大的foo值

&#13;
&#13;
function fooness(foo) {
  var fooportance = ["Extremely Foo", "Very Foo", "Foo", "Not So Foo"];
  return fooportance.indexOf(foo);
}

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

stringArray.sort(function(a, b) {
  return fooness(a) > fooness(b);
});

var mostFoo = stringArray[0];

console.log(mostFoo)
&#13;
&#13;
&#13;

答案 2 :(得分:0)

您可以按升序排列优先级数组,然后使用订单索引对stringArray进行排序:

const stringArray = [ "Foo", "Very Foo", "Not So Foo", 
                    "Foo", "Very Foo", "Extremely Foo" ]
const order = ['Not so Foo', 'Foo', 'Very Foo', 'Extremely Foo'];
stringArray.sort((a, b) => order.indexOf(b) - order.indexOf(a))
console.log(stringArray)

答案 3 :(得分:0)

如果需要显示数字,您应该有一个数字数组,只需数字转换为字符串。

答案 4 :(得分:0)

您可以将键映射到数字(您有四个键,因此:0,1,2,3),然后使用数字对字符串进行排序,之后最高字符串将位于第一个位置( 0):

var myMap = {"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" ];
stringArray.sort(function(a,b){
    return myMap[b] - myMap[a];
});
var highest = stringArray[0];