【问题标题】:Find the lowest among the next highest elements in an array in JavaScript在 JavaScript 中查找数组中下一个最高元素中的最低值
【发布时间】:2017-03-04 12:20:42
【问题描述】:

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

这是一个数组

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

【问题讨论】:

  • 当数组为[5, 2, 7, 10]时,你期望的结果是7。对吧?

标签: javascript arrays sorting


【解决方案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 ) );

【讨论】:

  • @SagnikChakraborti 您可以根据上面的示例想到这一点。 Hint:关注filter功能,这个功能是什么?这个方法的详细解释可以在这里找到developer.mozilla.org/en/docs/Web/JavaScript/Reference/…。如果你做不到,请告诉我。
  • 对于number = 5,它应该返回7,而不是2
  • @georg hm...你说得非常正确!非常感谢您发现这一点。我马上改正
【解决方案2】:

首先对数组进行排序,然后如果有重复项,则得到等于 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);

【讨论】:

  • 不考虑重复项
  • 怎么样?它应该支持重复查看更新的数组。
  • 我用过lastIndexOf()+1
  • 是的,很抱歉。
  • 不,先生,很高兴看到您的评论 :)
【解决方案3】:

这将返回大于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));

【讨论】:

    【解决方案4】:

    你可以用这个

          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
    

    【讨论】:

      【解决方案5】:

      您可以一次性完成此操作。它也考虑了重复项;

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

      【讨论】:

        【解决方案6】:

        您可以先排序,然后循环遍历数组,直到找到下一个更大的值。这样,即使您有多个,您也将始终拥有第二低的值。

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

        【讨论】:

        • 如果最小值有重复怎么办?
        • 我更新了我的反应。我在您的帖子中看到您将获得下一个大量变量“RandomNumber”。如果不是这种情况,您可以循环遍历数组,直到找到下一个不等于第一个的大数,在本例中为 sorterMyArray[0]。
        【解决方案7】:

        你可以使用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
        • 我得到了想要的结果,请看第三个例子。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-22
        • 1970-01-01
        相关资源
        最近更新 更多