在JavaScript

时间:2016-10-22 07:08:51

标签: javascript arrays sorting

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

这是一个数组

[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。

7 个答案:

答案 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

&#13;
&#13;
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;
&#13;
&#13;

答案 2 :(得分:1)

这将返回大于el的最小数组元素:

&#13;
&#13;
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;
&#13;
&#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));