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

时间:2012-08-09 20:11:10

标签: javascript

更新(制定错误的问题,请参阅下面的说明)

我有一个对象,它有一组以数字命名的属性,如示例所示。 “编号名称”不一定是连续的,也不知道它们的起点或终点。我知道其他属性不会用数字命名 我知道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

此编辑前的所有答案
谢谢你的回复。我不应该急着发布这个问题,应该在提交之前重新阅读。已经晚了,我赶时间。我道歉。
通过实际看到我的错误语句(使用数组而不是对象)我认为,基于我重新形成的问题的答案,我可能需要重写我的代码以使用数组而不是对象。我使用对象而不是数组的原因是另一个问题的原因。

到目前为止的努力
我试图找到一种方法将属性名称转换为数组,然后循环遍历它们,但这已经证明了cludgy。我正在寻找一种不易出错且优雅的方式。

7 个答案:

答案 0 :(得分:10)

修改:啊哈!现在问题变得更加有趣了。

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

我认为你可以自己把它转换成min;)

解决方案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])来检查某些内容是否 未定义。无论你喜欢什么。

答案 1 :(得分:1)

尝试循环遍历数组,直到找到第一个非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;
        }
    }
}

答案 2 :(得分:1)

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/map
https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/filter

答案 3 :(得分:0)

敏:

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

答案 4 :(得分:0)

尝试这样的事情:

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

答案 5 :(得分:-1)

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

答案 6 :(得分:-1)

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

function minIndex(arr){ for(el in arr){return el} }

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

注意事项: 但是第二个函数效率不高,因为它遍历整个数组。 如果您明确设置未定义的索引,这将不起作用。