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
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 に答える
-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 }

警告:2番目の関数は、配列全体をループするため、あまり効率的ではありません。未定義のインデックスを明示的に設定している場合、これは機能しません。

于 2012-08-09T20:29:22.720 に答える