2016-10-22 4 views
3

質問はちょっと変わったようです。気にしないで。JavaScriptの配列の次の要素の中で最も低いものを見つける

は、これが私ならばそれは7

何を返します。私は2の後の次の大きな数を取得したい場合は、ここに私のコードだ

var MyArray = [2, 7, 5, 10]; 
var RandomNumber = 2; 
var MinGreaterThanPos; 

for (var i =0; i < MyArray.length; i++) { 
    if (MyArray[i] <= RandomNumber) 
     continue; 

    if (typeof(MinGreaterThanPos) == 'undefined' || MyArray[i] < MinGreaterThanPos) 
    { 
     MinGreaterThanPos = i; 
    } 
} 

alert(MyArray[MinGreaterThanPos]); 

配列

[2, 7, 5, 10] 

です2の後にgreaterの数字の中で最も低い値にしたいですか?意味

7, 5, 10は2より大きく、しかし5と2の違いは、私はそれをどのように行います。2.

と比較して、残りのいずれかよりも少ないですので、私は、5を取得したいですか?

更新:これまでのところ、この時点に来

を、配列内のオブジェクトは何がありますか?例えば

var MyArray = [{user: 1, position:2}, {user:2, position: 6}, {user:3, position: 4}]; 

は私だけpositionと同じことをしたいです。私はポジション2を選択した場合は、その後、私は戻って取得するために期待しています次の位置は4としませ6.

+0

配列は[5、2、7、10]である場合は、あなたが期待する結果が7右ですか? – gzc

答えて

0

であるあなたは、あなたの問題を解決する別の方法は次の通りである。この

 var ar = [2,7,5,10]; 
     Math.min.apply(undefined, ar.filter(function(x,y){return y > 0})); 
     //for any explanation, tell it in comment 
1

を使用することができます。最初に、配列の最小要素を得るために、minメソッドを追加して配列を拡張します。これはhereから取られます。次に我々の配列をフィルタリングして、私たちの母親の数が閾値に等しいかそれ以下である列挙型を排除する。最後に、最小の数を見つける。

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

 
var numbers = [2, 7, 5, 10]; 
 
var number = 5; 
 
var numbers = numbers.filter(function(n){ 
 
    return n > number; 
 
}); 
 
console.log(Array.min(numbers));

+0

@SagnikChakrabortiあなたは上記の例に基づいてこれを考えることができます。 'ヒント': 'filter'関数に焦点を当てます、この関数は何ですか?このmehtodの詳細な説明はhttps://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filterにあります。あなたがそれを作ることができない場合は、私に知らせてください。 – Christos

+0

'number = 5'の場合、' 2'ではなく '7'を返します。 – georg

+0

@georg hm ...あなたはかなり正しいです!これを見つけていただきありがとうございます。すぐに修正します – Christos

0

あなたは、単一のパスで、次のように行う可能性があります。重複も考慮します。オブジェクトを1として

var arr = [2, 7, 5, 2, 10], 
 
result = arr.reduce((p,c) => c < p[0] ? (p[0] = c,p) 
 
             : c < p[1] ? (p[0] !== c && (p[1] = c),p) 
 
                : p, [Infinity,Infinity])[1]; 
 
console.log(result);

あなたは、単に次のように表示するようにコードを修正する配列項目として、

var arr = [{user: 1, pos:2}, {user:2, pos: 6}, {user:3, pos: 4}, {user:4, pos: 12}, {user:5, pos: 9}], 
 
result = arr.reduce((p,c) => c.pos < p[0].pos ? (p[0] = c,p) 
 
               : c.pos < p[1].pos ? (p[0].pos !== c.pos && (p[1] = c),p) 
 
                    : p, [{pos:Infinity},{pos:Infinity}])[1]; 
 
console.log(result);

0

あなたは最初にソートし、その配列を通って、あなたが次に大きい値を見つけるまでループすることができます。この方法では、複数の値を持っていても常に2番目に低い値になります。

var MyArray = [2,7,5,10]; 
var RandomNumber = 2; 
var MinGreaterThanPos; 

sortedMyArray = MyArray.sort(function(a, b){return a-b}); 
for(var i in sortedMyArray) { 
    if (sortedMyArray[i] > RandomNumber) { 
     MinGreaterThanPos = i; 
     break; 
    } 
} 
alert(sortedMyArray[MinGreaterThanPos]); 

あなたはとしての地位のために同じことを行うことができます。

var MyArray = [{user: 1, position:2}, {user:2, position: 6}, {user:3, position: 4}]; 
var RandomNumber = 2; 
var MinGreaterThanPos; 

sortedMyArray = MyArray.sort(function(a, b){return a.position-b.position}); 
for(var i in sortedMyArray) { 
    if (sortedMyArray[i].position > RandomNumber) { 
     MinGreaterThanPos = i; 
     break; 
    } 
}; 
alert(sortedMyArray[MinGreaterThanPos]); 

そして、あなたは、乱数

var MyArray = [{user: 1, position:2}, {user:2, position: 6}, {user:3, position: 4}]; 
var MinGreaterThanPos; 

sortedMyArray = MyArray.sort(function(a, b){return a.position-b.position}); 
for(var i in sortedMyArray) { 
    if (sortedMyArray[i].position > sortedMyArray[0].position) { 
     MinGreaterThanPos = i; 
     break; 
    } 
}; 
alert(sortedMyArray[MinGreaterThanPos]); 
+0

最小値の重複がある場合はどうなりますか? – Redu

+0

私の反応を更新しました。私はあなたのポストでは、変数 "RandomNumber"の次の大きな数を取得します。そうでない場合は、最初の配列と同じでない次の大きい番号(この場合はsorterMyArray [0])を見つけるまで配列をループすることができます。 – hakany

0

を使用したくない場合は、Array#reduceを使用することができます。

function getItem(array, search) { 
 
    return array.reduce(function (r, a) { 
 
     return a.position > search && (!r || r.position > a.position) ? a : r; 
 
    }, undefined); 
 
} 
 

 
var array1 = [{ user: 1, position: 2 }, { user: 2, position: 6 }, { user: 3, position: 4 }], 
 
    array2 = [{ user: 1, position: 2 }, { user: 2, position: 6 }, { user: 3, position: 4 }, { user: 4, position: 5 }]; 
 

 
console.log(getItem(array1, 2)); 
 
console.log(getItem(array2, 2));

+0

配列が 'var配列= {{ユーザー:1、位置:2}、{ユーザー:2、位置:6}、{ユーザー:3、位置:4}、{ユーザー:4、位置:5} '' number = 5'を検索すると '6 'を返すはずの' undefined'が返されます – marukobotto

+0

私は望みの結果を得ています、3番目の例を見てください。 –

1

まず、あなたは配列をソート重複

var MyArray = [2,2,2, 10, 7, 5,5,7,5];//to test duplicates 
 
var RandomNumber = 2; 
 
var srt = MyArray.sort(function(a,b){return a-b}); 
 
var MinGreaterThanPos = srt[srt.lastIndexOf(RandomNumber)+1]; 
 

 

 
alert(MinGreaterThanPos);

+0

アカウントに重複を取らない – georg

+0

どうすればよいですか?重複をサポートする必要があります更新された配列を参照してください。 –

+0

私は 'lastIndexOf()+ 1'を使用しました –

1

がある場合、あなたはこれが最小限のを返す次RandomNumberに等しい最後の項目の取得elより大きい配列要素:

function minNext (a, el) { 
 
    var min = Infinity; 
 
    
 
    for (let x of a) { 
 
    if (x > el && x - el < min - el) 
 
     min = x; 
 
    } 
 
    
 
    return min; 
 
} 
 

 
// 
 

 
let a = [1,9,2,8,3,-2,7,4,-3,6,5,5,5]; 
 
for (let x of a) 
 
    console.log(x, minNext(a, x))

あまり効率的で、より多くの慣用的な:

let minNext = (a, el) => Math.min.apply(0, a.filter(x => x > el)); 
関連する問題