更新 (制定错误的问题,见下面的说明)
我有一个对象,它有一组以数字命名的属性,如示例所示."编号名称"不一定是连续的,也不知道它们的起点或终点.我知道其他属性不会用数字命名.
我知道myObject ["propName"]与myObject.propName相同,但我故意以第一种方式编写它,因为myObject.0看起来很怪异并且没有被所有编辑器识别.
如何获得最小和最大数组索引?
所以在这种情况下
myObject["0"] = undefined
myObject["1"] = {}
myObject["2"] = undefined
myObject["3"] = {}
myObject["4"] = {}
myObject["5"] = undefined
myObject["someOtherProperty"] = {}
Run Code Online (Sandbox Code Playgroud)
会给我这个
minIndex(myObject) == 1
maxIndex(myObject) == 4
Run Code Online (Sandbox Code Playgroud)
在此编辑之前的所有答案
感谢您的回复.我不应该急着发布这个问题,应该在提交之前重新阅读.已经晚了,我赶时间.我很抱歉.
通过实际看到我的错误语句(使用数组而不是对象)我认为,基于我重新形成的问题的答案,我可能需要重写我的代码以使用数组而不是对象.我使用对象而不是数组的原因是另一个问题的材料.
到目前为止,
我已经尝试找到一种方法将属性名称转换为数组,然后循环遍历它们,但这已经证明了这一点.我正在寻找一种不易出错且优雅的方式.
Nic*_*ick 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;
}
Run Code Online (Sandbox Code Playgroud)
我想你可以自己将它转换为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;
}
Run Code Online (Sandbox Code Playgroud)
按计划继续!
要找到最小的,从底部开始,一直向上,直到找到它为止.
function minIndex(myArray){
for(var i = 0; i < myArray.length; i++){
if(typeof myArray[i] !== 'undefined')
return i;
}
}
Run Code Online (Sandbox Code Playgroud)
为了获得最大,从顶部开始.
function maxIndex(myArray){
for(var i = myArray.length - 1; i >= 0; i--){
if(typeof myArray[i] !== 'undefined')
return i;
}
}
Run Code Online (Sandbox Code Playgroud)
两者都是最坏的情况O(n).你不能真的做得更好,因为整个数组可能是空的,你必须检查每个元素是否为正.
编辑:正如所提到的,你也可以看一看是不是通过简单地写不确定if(myArray[i]).无论你喜欢什么.