更新(制定错误的问题,请参阅下面的说明)
我有一个对象,它有一组以数字命名的属性,如示例所示。 “编号名称”不一定是连续的,也不知道它们的起点或终点。我知道其他属性不会用数字命名 我知道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。我正在寻找一种不易出错且优雅的方式。
答案 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 }
注意事项: 但是第二个函数效率不高,因为它遍历整个数组。 如果您明确设置未定义的索引,这将不起作用。