【问题标题】:Most efficient way to get the string with highest priority out of an array从数组中获取具有最高优先级的字符串的最有效方法
【发布时间】:2018-01-16 09:45:44
【问题描述】:

假设我有一个数组如下:

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”>“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 中有更有效的不同方法?

【问题讨论】:

    标签: javascript arrays string ecmascript-6 comparison


    【解决方案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);

    【讨论】:

    • 我喜欢这里的 array.reduce 用法。非常干净,这意味着我不必使用排序修改我的原始数组。
    • 如果我们找到可能的最高值“Extremely Foo”,您认为是否有可能中断 reduce 执行?考虑通过数组完成迭代是没有意义的。
    • 您不能跳出 Array#reduce,但您可以使用旧的 for 或 while 循环在找到某些内容时中断。但是,如果我们谈论的是短数组,您不会一直迭代,并且您不希望“Extremely Foo”以非常高的频率出现,那么毫无意义的情况就不会那么频繁了。跨度>
    • 感谢您的回答。 :)
    • 我们信任 Foo :)
    【解决方案2】:

    您可以按升序排列优先级,然后使用顺序索引对您的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】:

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

      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)

      【讨论】:

      • 愚蠢和 fooportance 呵呵。 :p +1 为此,但我认为 array.reduce 答案更适合我正在寻找的内容。
      • @snaplemouton - 很公平,我个人希望减少一些愚蠢的东西 -> jsfiddle.net/rjoxyq2a/1
      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-31
        • 1970-01-01
        • 2012-12-18
        相关资源
        最近更新 更多