2016-07-08 3 views
2

У меня есть массив, который содержит несколько номеров, например:Наибольшее значение из массива

highAndLow("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6") 

Я хотел бы получить наименьшее и наибольшее число из этого массива. Это кажется довольно простой задачей, но случайно я получаю неправильный вывод для кода ниже.

function highAndLow(numbers){ 
var args = Array.prototype.slice.call(arguments); 
var m = 0, i = 0, n = args.length; 

console.log(args.length) 

    for (i=0; i < n; i++) { 
     if (args[i] > m) { 
      m = args[i]; 
      console.log(m) 
     } 
    } 

return m 

} 

Это говорит длина 1 и возвращается значение 0.

+2

Это не массив, это строка. – deceze

+0

сделать вторую строку 'var arguments = numbers.split ('');' – CompanyDroneFromSector7G

ответ

9

У вас есть строка в качестве параметра. Сначала вам нужно разбить. И конвертируйте в Number.

args = numbers.split(' ').map(Number); 

Незначительный намек: вы можете использовать первый элемент в качестве первого значения min/max и итерации со второго элемента.

function highAndLow(numbers) { 
 
    var args = numbers.split(' ').map(Number), 
 
     min = args[0], 
 
     max = args[0], 
 
     i, 
 
     n = args.length; 
 

 
    for (i = 1; i < n; i++) { 
 
     if (args[i] < min) { 
 
      min = args[i]; 
 
     } 
 
     if (args[i] > max) { 
 
      max = args[i]; 
 
     } 
 
    } 
 
    return { min: min, max: max }; 
 
} 
 

 
console.log(highAndLow("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"));

+3

'Math.max.apply (Math, numbers.split ('') .map (Number));' –

+0

справа, но его расщепление проблема, а не максимальная проблема. –

+1

Просто любопытный вопрос: 'Math.max' или' Math.min' будет работать внутри цикла. Поэтому, если мы запускаем одиночный цикл и присваиваем значение «min» и «max», оно должно быть быстрее. Кроме того, '.apply' будет обновлять контекст, поэтому он должен занимать несколько миллисекунд. Но '.apply' работает быстрее. [JSFiddle] (https://jsfiddle.net/L4a5hpby/). Как? – Rajesh

5

Вы можете использовать Math.max(), Math.min():

function highAndLow(str){ 
 
    var arr = str.split(/\s/); 
 
    var max = Math.max.apply(Math, arr); 
 
    var min = Math.min.apply(Math, arr); 
 
    console.log('Max:::', max, " Min::::", min); 
 
} 
 

 
highAndLow("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6");

2

Вы передаете строку в качестве параметра к вашей функции.

highAndLow("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6") 

следует заменить

highAndLow([4, 5, 29, 54, 4, 0, -214, 542, -64, 1, -3, 6, -6]); 

фактически передать массив с числами.

+0

Кроме того, попробуйте не выполнять 'str.split ('')' в самой функции. Попробуйте передать значение как фактический массив (иначе, выполняйте работу вне функции). Итак, если у вас нет контроля над строковой частью (возможно, странным api), сделайте что-то вроде 'highAndLow (inputStr.split (''))'. –

1

function highAndLow(data) { 
 
    var data = "4 5 29 54 4 0 -214 542 -64 1 -3 6 -6"; 
 
    var dataArr = data.split(' ').map(Number); 
 
    var result = {}; 
 
    result.max = Math.max.apply(Math, dataArr); 
 
    result.min = Math.min.apply(Math, dataArr); 
 
    return result; 
 
} 
 
var res = highAndLow("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6") 
 
console.log(res.min); 
 
console.log(res.max);

1

Вот самый простой способ сделать это:

function highAndLow(str) { 
 
    str = str.split(' ').sort(function(a, b) { 
 
    return parseInt(a) - parseInt(b) 
 
    }); 
 
    return [str[str.length - 1], 
 
    str[0] 
 
    ]; 
 
} 
 
document.write(highAndLow('4 5 29 54 4 0 -214 542 -64 1 -3 6 -6'));

+0

Мне нравится 'sort', это больше/меньше/как исполнитель vs' min'/'max'? –

+0

Я не совсем уверен, что вы подразумеваете под 'min' /' max', но он имеет довольно высокую производительность. Может быть лучше, например, вызывая 'parseInt' в вызове' .map', а затем сортируя. –

1

Вы можете попробовать этот код.

<script type="text/javascript"> 

function highAndLow(numbers) 
{ 

       var args = numbers.split(" ");      
       console.log(args.length) 
       var min = Math.min.apply(Math, args), 
       max = Math.max.apply(Math, args); 
       console.log(min); 
       console.log(max); 


} 

highAndLow('4 5 29 54 4 0 -214 542 -64 1 -3 6 -6'); 
</script> 
1

Соединитель splice.call возвращает некоторую вещь, а не длину массива, потому что он видит все как символы.

Эта реализация должна помочь,

  1. разбить строку с пространством, используя массив.Раскол (delimter) Javascript Split
  2. Затем преобразовать расщепляется массив на номер, как вы сделать тест
  3. Мы перебрать и тест для минимального и максимального значения массива

// Code goes here 
 

 
    
 
function highAndLow(numbers){ 
 
    var args = numbers.split(" "); 
 
    
 
    var n= args.length; 
 
    
 
    document.getElementById("argLength").innerHTML="Array Length:"+n; 
 
    
 
    var i=0; 
 
    var max = Number(args[i]); 
 
    var min = Number(args[i]); 
 
    
 
    for(i=1;i<n; i++){ 
 
    var num=Number(args[i]); 
 
    
 
    if(num>max) 
 
     max=num; 
 
    
 
    if(min>num) 
 
     min=num; 
 
    
 
    } 
 
    
 
    document.getElementById("output").innerHTML=("Min:"+min+", Max:"+max); 
 
    
 
}
<!DOCTYPE html> 
 
<html> 
 

 
    <head> 
 
    
 
    </head> 
 

 
    <body onload='highAndLow("4 5 29 54 4 0 -214 542 -64 1 -3 6 -6");'> 
 
    
 
    <h1 id="argLength"></h1> 
 
    
 
    <h1 id="output"> </h1> 
 
    </body> 
 

 
</html>

Смежные вопросы