获取整数对象属性名称的最小值和最大值

Get minimum and maximum of object property names that are integers

本文关键字:最小值 最大值 整数 对象 属性 获取      更新时间:2023-09-26

UPDATE(问题表述错误,见下面的注释)

我有一个对象,该对象具有一组以数字命名的属性,如示例中所示。"编号名称"不一定是连续的,我也不知道它们的开始或结束位置。我知道其他属性不会用数字命名。
我知道myObject["propName"]与myObject.propName相同,但我故意以第一种方式编写它,因为myObject.0看起来很奇怪,并且没有得到所有编辑器的认可。

如何获取最小和最大数组索引?

所以在这种情况下

myObject["0"] = undefined
myObject["1"] = {}
myObject["2"] = undefined
myObject["3"] = {}
myObject["4"] = {}
myObject["5"] = undefined
myObject["someOtherProperty"] = {}

会给我这个

minIndex(myObject) == 1
maxIndex(myObject) == 4

查看此编辑
之前的所有答案感谢您的回复。我不应该匆忙发布这个问题,应该在提交之前重新阅读它。很晚了,我很着急。我道歉。
通过实际看到我的错误陈述(使用数组而不是对象),我认为,根据我重新制定的问题的答案,我可能需要重写我的代码以使用数组而不是对象。我使用对象而不是数组的原因是另一个问题的材料。

迄今为止
的努力我尝试找到一种将属性名称转换为数组然后循环访问它们的方法,但事实证明这很笨拙。我正在寻找一种不那么容易出错和优雅的方式。

编辑:啊哈!现在问题变得更加有趣。

解决方案1:让我们一次性解决这个问题,好吗?对于最大值:

function maxIndex(obj){
    var max = -1;
    for(var i in myObject){
        var val = parseInt(i);
        if(isFinite(val)){
            if(typeof obj[val] !== 'undefined' && val > max){
                max = val;
            }
        }
    }
    return max;
}

我认为您可以自行将其转换为最小值;)

解决方案

2:在这里,我会将您的对象恢复到我们最初认为的状态,以防您真的喜欢其他解决方案之一。那么其余的答案适用。

function convertObject(obj){
    var output = [];
    for(var i in myObject){
        var val = parseInt(i);
        if(isFinite(val)){         
            output[val] = obj[i]; //Gotta love JS
        }
    }
    return output;
}

按计划继续!


要找到最小的,请从底部开始,然后逐步向上,直到找到它。

function minIndex(myArray){
    for(var i = 0; i < myArray.length; i++){
        if(typeof myArray[i] !== 'undefined')
            return i;
    }
}

要获得最大的,请从顶部开始。

function maxIndex(myArray){
    for(var i = myArray.length - 1; i >= 0; i--){
        if(typeof myArray[i] !== 'undefined')
            return i;
    }
}

两者都是最坏情况 O(n)。你不能做得更好,因为整个数组可能是空的,你必须检查每个元素都是正的。

编辑:如前所述,您还可以通过简单地编写if(myArray[i])来检查某些内容是否定义。任何适合你喜欢的东西。

var myObject = {};
myObject["0"] = undefined;
myObject["1"] = {};
myObject["2"] = undefined;
myObject["3"] = {};
myObject["4"] = {};
myObject["5"] = undefined;
myObject["someOtherProperty"] = {};
var keys = Object.keys(myObject).map(Number).filter(function(a){
    return isFinite(a) && myObject[a];
});
var min = Math.min.apply(Math, keys);
var max = Math.max.apply(Math, keys);
console.log(min, max); //Logs 1 and 4

所有文档和兼容性信息:


https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/maphttps://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter

尝试遍历数组,直到找到第一个非undefined元素。

function minIndex(arr){
    for(var i = 0, len = arr.length; i < len; i++){
        if(arr[i] !== undefined){
            return i;
        }
    }
}

对于最大索引,执行相同的操作,但相反。

function maxIndex(arr){
    for(var i = arr.length-1, len = 0; i >= len; i--){
        if(arr[i] !== undefined){
            return i;
        }
    }
}

min:

for(var i = 0; i < myArray.length; i++) {
    if(myArray[i] != undefined) {
        return i;
    }
}

麦克斯:

for(var i = myArray.length-1; i >= 0; i--) {
    if(myArray[i] != undefined) {
        return i;
    }
}

尝试这样的事情:

function minIndex(var array){
   for(var i = 0; i < array.length; i++)
   {
      if(typeof array[i] != "undefined")
      return i;
   }
   return null;
}
function maxIndex(var array){
   var returnIndex = -1;
   for(var i = 0; i < array.length; i++)
   {
      if(typeof array[i] != "undefined")
      returnIndex = i;
   }
   if(returnIndex !== -1) return returnIndex;
   else return null;
}

利用了以下事实:for..in 仅迭代定义的元素,并使用索引:

function minIndex(arr){ for(el in arr){return el} }
function maxIndex(arr){var v; for(el in arr){v = el}; return v }

警告:第二个函数不是很有效,因为它循环遍历整个数组。如果您显式设置未定义的索引,这将不起作用。

var max=0;
var min=myArray.length;
for (var i in myArray)
    if (myArray[i]!==undefined)
    {
        max=Math.max(i, max);
        min=Math.min(i, min);
    }