2016-10-22 118 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)); 
相关问题