0

已更新 (问题表述错误,请参见下面的注释)

我有一个对象,该对象具有一组以数字命名的属性,如示例中所示。“编号名称”不一定是连续的,我也不知道它们从哪里开始或结束。我知道其他属性不会用数字命名。
我知道 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

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

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

4

7 回答 7

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])未定义。随心所欲,随心所欲。

于 2012-08-09T20:14:05.490 回答
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;
        }
    }
}
于 2012-08-09T20:15:16.283 回答
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

于 2012-08-10T16:19:07.993 回答
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;
    }
}
于 2012-08-09T20:18:20.853 回答
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;
}
于 2012-08-09T20:19:29.230 回答
-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 }

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

于 2012-08-09T20:29:22.720 回答
-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);
    }
于 2012-08-09T20:15:53.310 回答