2016-10-22 179 views
3

這個問題似乎有點奇怪。沒關係。查找JavaScript中數組中下一個最高元素中最低的元素

這是一個數組

[2, 7, 5, 10] 

如果我想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]); 

它會返回7.

如果我想要在2位以後獲得greater數字中最低的數字?

這意味着,7, 5, 10是大於2,但我想5,因爲比任何其他部分與2

比較我將如何做到這一點的5和2之間的差異較小?

更新時間:

到這種地步,到目前爲止,如果有一個數組中的對象?

例如:

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

另一種方法來解決你的問題如下。最初,我們擴展了Array添加一個min方法,以便獲得數組的最小元素。這取自here。然後我們過濾我們的數組,以便我們排除那些小於或等於我們作爲閾值的數量的enries。最後我們找到最小號碼。

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你可以根據上面的例子想到這一點。 'Hint':關注'filter'功能,這個功能是什麼?這個mehtod的詳細解釋可以在這裏找到https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter。如果你做不到,就讓我知道。 – Christos

+0

對於'number = 5',它應該返回'7',而不是'2'。 – georg

+0

@georg嗯......你很對!非常感謝您發現這一點。我會立即更正 – Christos

0

你可以做這樣的在一個單一的通行證。它也考慮到重複的情況;

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

你可以先進行排序,然後遍歷數組直到找到下一個較大的值。這樣,即使你有多個,你也會始終保持第二低的價值。

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

如果你不想使用RandomNumber

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 array = [{user:1,position:2},{user:2,position:6},{user:3,position:4},{user:4,position:5}] '我搜索'number = 5',然後返回'undefined'它應該返回'6' – marukobotto

+0

我得到了想要的結果,請看第三個例子。 –

1

首先你對數組進行排序,然後你接下來最後一個項目等於RandomNumber如果有重複

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

這將返回最小的數組元素大於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)); 
相關問題