这个问题似乎有点奇怪。没关系。
这是一个数组
[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,因为5和2之间的差异小于其他任何一个与2相比。
我将如何做到这一点?
更新
到目前为止,如果数组中有对象怎么办?
例如:
var MyArray = [{user: 1, position:2}, {user:2, position: 6}, {user:3, position: 4}];
我只想用position
做同样的事情。如果我选择位置2,那么我希望回到的下一个位置是4而不是6。
答案 0 :(得分:1)
解决问题的另一种方法如下。最初,我们扩展Array添加一个min方法,以便我们获得数组的最小元素。这取自DiscreteGaussianDistributionPolynomialSampler。然后我们过滤我们的数组,以便我们排除小于或等于我们作为阈值的数字的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 ) );
答案 1 :(得分: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);
&#13;
答案 2 :(得分: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))
&#13;
效率较低,但更惯用:
let minNext = (a, el) => Math.min.apply(0, a.filter(x => x > el));
答案 3 :(得分: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
答案 4 :(得分: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);
答案 5 :(得分: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]);
答案 6 :(得分: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));