2017-08-08 45 views
0

比方说,我有一个数组如下:最有效的方式来获得具有最高优先级的串出数组的

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" ]; 

那么这将是最有效的方式,以获得最大值O最重要的是,按照重要性顺序排列:“Veryly 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?

回答

1

您可以使用阵列#减少,并且在每次迭代取字符串值最高的枚举:

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);

+0

我喜欢这里的array.reduce用法。非常干净,这意味着我不必修改我的原始数组。 – snaplemouton

+0

如果我们找到最高可能值“Extremely Foo”,您是否认为有可能打破减少执行?考虑到完成迭代通过数组将是毫无意义的。 – snaplemouton

+0

你不能摆脱数组#减少,但你可以使用旧的for或while循环来找到某些东西。但是,如果我们谈论的是短阵列,并不是所有的时间都在进行迭代,而且你也不希望“极富特征”以非常高的频率出现,那么毫无意义就不会经常出现。 –

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)

0

你应该有一个数字阵列的,只是转换数字为字符串,如果你需要显示它们。

1

如果你有的fooportance一个数组,你可以创建一个fooness函数,确定FOOS

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)

+0

fooness和fooportance呵呵。 :p +1,但是我认为array.reduce答案更符合我的需求。 – snaplemouton

+2

@snaplemouton - 够公平的,我个人喜欢一些减少更多的女性 - > https://jsfiddle.net/rjoxyq2a/1/ – adeneo

0

阵列中最FOO值您可以将按键映射到数字(你有四个键,所以: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];