web-dev-qa-db-ja.com

Javascriptの配列から最小値を取得しますか?

配列justPricesの値は次のとおりです。

[0] = 1.5
[1] = 4.5
[2] = 9.9.

配列の最小値を返すにはどうすればよいですか?

53
lisovaccaro

Jon Resigは、 この記事 で説明しています。Arrayプロトタイプを拡張し、基礎となる Math.minを呼び出すことでこれを実現する方法 残念ながら配列ではなく可変数の引数を取るメソッド:

Array.min = function( array ){
    return Math.min.apply( Math, array );
};

その後:

var minimum = Array.min(array);
86
Darin Dimitrov

最小値を見つけるための最も表現力豊かなコードは、おそらく rest parameters

const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
const min = Math.min(...arr)
console.log(min)

関数のコンテキストを変更する必要がない場合、残りのパラメーターは基本的に Function.prototype.apply の便利な略記です。

var arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
var min = Math.min.apply(Math, arr)
console.log(min)

これは Array.prototype.reduce の優れたユースケースでもあります。

const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
const min = arr.reduce((a, b) => Math.min(a, b))
console.log(min)

Math.minreduceに直接渡すのは魅力的かもしれませんが、コールバックは追加のパラメーターを受け取ります。

callback (accumulator, currentValue, currentIndex, array)

この特定のケースでは、少し冗長かもしれません。 reduceは、単一の値に集約する複雑なデータのコレクションがある場合に特に便利です。

const arr = [{name: 'Location 1', distance: 14}, {name: 'Location 2', distance: 58}, {name: 'Location 3', distance: 20}, {name: 'Location 4', distance: 77}, {name: 'Location 5', distance: 66}, {name: 'Location 6', distance: 82}, {name: 'Location 7', distance: 42}, {name: 'Location 8', distance: 67}, {name: 'Location 9', distance: 42}, {name: 'Location 10', distance: 4}]
const closest = arr.reduce(
  (acc, loc) =>
    acc.distance < loc.distance
      ? acc
      : loc
)
console.log(closest)

そしてもちろん、常に古典的なイテレーションを使用できます:

var arr,
  i,
  l,
  min

arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
min = Number.POSITIVE_INFINITY
for (i = 0, l = arr.length; i < l; i++) {
  min = Math.min(min, arr[i])
}
console.log(min)

...しかし、古典的なイテレーションでさえ現代の変身を得ることができます:

const arr = [14, 58, 20, 77, 66, 82, 42, 67, 42, 4]
let min = Number.POSITIVE_INFINITY
for (const value of arr) {
  min = Math.min(min, value)
}
console.log(min)
73
zzzzBov

配列の最小値を返す最も簡単な方法は、Math.min()関数でSpread Operatorを使用することです。

return Math.min(...justPrices);
//returns 1.5 on example given 

MDNのページは、それをよりよく理解するのに役立ちます。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/min

もう少し追加:これはMath.max()関数でも機能します

return Math.max(... justPrices); //指定された例で9.9を返します。

お役に立てれば!

38
tdowek1

更新: Darin/John Resigの回答を使用します。minにthisArgを指定する必要はないので、Math.min.apply(null, arr)は正常に機能します。


または、単にsort配列で値#1を取得できます:[2,6,7,4,1].sort()[0]

[!]しかし、カスタム番号ソート機能を提供しない場合、これは非常に限られた1つのケースでのみ機能します:10未満の正の数。それが壊れる方法を参照してください:

var a = ['', -0.1, -2, -Infinity, Infinity, 0, 0.01, 2, 2.0, 2.01, 11, 1, 1e-10, NaN];

// correct: 
a.sort( function (a,b) { return a === b ? 0 : a < b ? -1: 1} );
//Array [NaN, -Infinity, -2, -0.1, 0, "", 1e-10, 0.01, 1, 2, 2, 2.01, 11, Infinity]

// incorrect:
a.sort();
//Array ["", -0.1, -2, -Infinity, 0, 0.01, 1, 11, 1e-10, 2, 2, 2.01, Infinity, NaN]

また、配列はその場で変更されます、これはあなたが望むものではないかもしれません。

13
c69

この配列があると想像してください:

var arr = [1, 2, 3];

ES6の方法:

var min = Math.min(...arr); //min=1

ES5の方法:

var min = Math.min.apply(null, arr); //min=1

D3.jsを使用する場合、同じことを行う便利な関数がありますが、ndefinedの値を無視し、自然な順序も確認します。

d3.max(array [、accessor])

自然順序を使用して、指定された配列の最大値を返します。配列が空の場合、undefinedを返します。オプションのアクセサー関数を指定できます。これは、最大値を計算する前にarray.map(accessor)を呼び出すのと同じです。

組み込みのMath.maxとは異なり、このメソッドは未定義の値を無視します。これは、欠落データを無視するのに役立ちます。さらに、要素は数値順序ではなく自然順序を使用して比較されます。たとえば、文字列[“ 20”、“ 3”]の最大値は“ 3”であり、数字の最大値[20、3]は20です。

そして、これはD3 v4のソースコードです。

export default function(values, valueof) {
  var n = values.length,
      i = -1,
      value,
      max;

  if (valueof == null) {
    while (++i < n) { // Find the first comparable value.
      if ((value = values[i]) != null && value >= value) {
        max = value;
        while (++i < n) { // Compare the remaining values.
          if ((value = values[i]) != null && value > max) {
            max = value;
          }
        }
      }
    }
  }

  else {
    while (++i < n) { // Find the first comparable value.
      if ((value = valueof(values[i], i, values)) != null && value >= value) {
        max = value;
        while (++i < n) { // Compare the remaining values.
          if ((value = valueof(values[i], i, values)) != null && value > max) {
            max = value;
          }
        }
      }
    }
  }

  return max;
}
6
Alireza

ES6は未来への道です。

arr.reduce((a, b) => Math.min(a, b));

このフォームは、他のユースケースに簡単に一般化できるため、私は好んで使用します

5

おそらくもっと簡単な方法ですか?

JustPricesが値の点で混同されているため、最小値がどこにあるかわからないとしましょう。

justPrices[0] = 4.5
justPrices[1] = 9.9
justPrices[2] = 1.5

ソートを使用します。

justPrices.sort();

それはあなたのためにそれらを整理します。 (アルファベット順に行うこともできます。)配列は昇順で配置されます。

justPrices[0] = 1.5
justPrices[1] = 4.5
justPrices[2] = 9.9

その後、最初のインデックスで簡単に取得できます。

justPrices[0]

例として最も低い3つの数字が必要な場合はどうすればよいのでしょうか。また、並べ替える順序を切り替えることもできます。詳細は http://www.w3schools.com/jsref/jsref_sort.asp

2
Akexis
var array =[2,3,1,9,8];
var minvalue = array[0]; 
for (var i = 0; i < array.length; i++) {
    if(array[i]<minvalue)
    {
        minvalue = array[i];
    }

}
  console.log(minvalue);
2
suraj
function smallest(){
  if(arguments[0] instanceof Array)
    arguments = arguments[0];

  return Math.min.apply( Math, arguments );
}
function largest(){
  if(arguments[0] instanceof Array)
    arguments = arguments[0];

  return Math.max.apply( Math, arguments );
}
var min = smallest(10, 11, 12, 13);
var max = largest([10, 11, 12, 13]);

console.log("Smallest: "+ min +", Largest: "+ max);
1
Libu Mathew

私は、javaScriptの基本だけを使用して、これに対するわかりやすいソリューションがあると思います。

function myFunction() {
            var i = 0;
            var smallestNumber = justPrices[0];
            for(i = 0; i < justPrices.length; i++) {
                if(justPrices[i] < smallestNumber) {
                    smallestNumber = justPrices[i];
                }
            }
            return smallestNumber;
        }

変数smallestNumberjustPricesの最初の要素に設定され、forループは配列をループします(forループがどのように機能するか知っていると仮定します。アップ)。配列の要素が現在のsmallestNumber(最初は最初の要素)よりも小さい場合、その値を置き換えます。配列全体がループを通過すると、smallestNumberには配列内の最小の数値が含まれます。

0
Sara

UnderscoreまたはLodashを使用している場合、この種のシンプルな機能パイプラインを使用して最小値を取得できます

_.chain([7, 6, -1, 3, 2]).sortBy().first().value()
// -1

また、.min 関数

_.min([7, 6, -1, 3, 2])
// -1
0
svarog

以下は、数値の配列の最小値を検出するコードです。

//function for finding smallest value in an array
function arrayMin(array){
    var min = array[0];
    for(var i = 0; i < array.length; i++){
        if(min < array[i]){
            min = min;
        }else if (min > array[i]){
            min = array[i + 1];
        }else if (min == array[i]){
            min = min;
        }
    }
    return min;
};

この方法で呼び出します:

var fooArray = [1,10,5,2];
var foo = arrayMin(fooArray);

(2番目のelse if 生じる: min = minからmin = array[i]最小値に達する数字で元の数字を置き換える場合。

0
Darrow Hartman