在JavaScript中查找数组中下一个最高元素中的最小值

3

这个问题似乎有点奇怪。没关系。

这是一个数组

[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之间的差异较小。
我该怎么做?
更新:
到目前为止,如果数组中有对象怎么办?
例如:
var MyArray = [{user: 1, position:2}, {user:2, position: 6}, {user:3, position: 4}];

我想用position完成相同的事情。如果我选择位置2,则下一个我希望得到的位置是4而不是6。


当数组为[5, 2, 7, 10]时,你期望的结果是7。对吧? - gzc
7个回答

1

解决问题的另一种方法如下。首先,我们扩展数组添加一个min方法,以便获得数组的最小元素。这是从这里获取的。然后我们过滤数组,排除小于或等于我们作为阈值的数字的项。最后,我们找到最小的数字。

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


@SagnikChakraborti,你可以根据上面的例子来思考这个问题。提示:关注filter函数,这个函数是做什么的?你可以在这里找到这个方法的详细解释:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/filter。如果你还有疑问,请告诉我。 - Christos
对于 number = 5,它应该返回 7,而不是 2 - georg
@georg 嗯...你说得很正确!非常感谢你指出这个问题。我会立即进行更正。 - Christos

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


不考虑重复项 - georg
如何实现支持重复元素的数组更新? - Mamdouh Saeed
我使用了 lastIndexOf()+1 - Mamdouh Saeed
是的,抱歉。 - georg
不,先生。很高兴看到您的评论 :) - Mamdouh Saeed

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

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
你可以使用 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));


如果我的数组为 var array = [{ user: 1, position: 2 }, { user: 2, position: 6 }, { user: 3, position: 4 }, {user:4, position: 5}],而我搜索 number = 5,则它返回了 undefined,而不是应该返回的 6 - marukobotto
我得到了想要的结果,请看第三个例子。 - Nina Scholz

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

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

如果最小值有重复怎么办? - Redu
我已经更新了我的反应。我在你的帖子中看到,你将获得变量“RandomNumber”的下一个大数。如果不是这种情况,您可以循环遍历数组,直到找到下一个大于第一个元素(在这种情况下为sorterMyArray [0])的数字。 - hakany

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接