web-dev-qa-db-ja.com

オブジェクト数値プロパティの自動並べ替えを防ぐ方法は?

この問題に遭遇した理由:アルゴリズムの問​​題を解決しようとしましたが、ほとんどの場合、配列に出現する数値を返す必要があります。 [5,4,3,2,1,1]のように1を返す必要があります。また、2つの数値が最大出現回数と同時に表示される場合、1つが最初に来ます。 [5,5,2,2,1]と同様に、5が最初に表示されるため、5を返します。オブジェクトを使用して、各数値の外観を保存します。キーは数字そのものです。

したがって、入力が[5,5,2,2,1]の場合、オブジェクトはObject {5: 2, 2: 2, 1: 1}ですが、実際にはObject {1: 1, 2: 2, 5: 2}したがって、オブジェクトを反復するためにfor..inを使用すると、5ではなく2が返されました。だから私はこの質問をしたのです。

この問題はChromeコンソールで発生しますが、これが一般的な問題であるかどうかはわかりません:次のコードを実行すると

var a = {};
a[0]=1;
a[1]=2;
a[2]=3;

aは:Object {0: 1, 1: 2, 2: 3}

しかし、私が次のように割り当ての順序を逆にすると:

 var a = {};
 a[2]=3;
 a[1]=2;
 a[0]=1;

aも:Object {0: 1, 1: 2, 2: 3}数値プロパティは昇順で自動的にソートされます。私は数値プロパティを前置または後置してみました

var a = {};
a['p'+0]=1;
a['p'+1]=2;
a['p'+2]=3;
console.log(a);//Object {p0: 1, p1: 2, p2: 3}

そして、これはプロパティの順序を維持します。これは問題を解決する最良の方法ですか?そして、とにかくこの自動ソート動作を防ぐ方法はありますか?これはChrome= V8 JavaScriptエンジンでのみ発生しますか?よろしくお願いします!

14
AndyHu

JS objectを使用していますが、これは定義上、順序を維持しません。キー=>バリューマップと考えてください。

挿入するarrayに何を挿入しても保持するindexを使用する必要があります。リストと考えてください。

また、毎回同じインデックスに要素を挿入したため、notが実際に「割り当ての順序を逆に」したことにも注意してください。

3
Marcelo
target = {}
target[' ' + key] = value // numeric key

これにより、オブジェクトの数値プロパティの自動並べ替えができなくなります。

3
201709071716

JavaScriptのオブジェクトフィールドの順序に本当に依存することはできませんが、MapES6/ES2015 standardkey, valueペアオブジェクトの順序を維持する必要がある場合。以下のスニペットをご覧ください。

let myObject = new Map();
myObject.set('z', 33);
myObject.set('1', 100);
myObject.set('b', 3);

for (let [key, value] of myObject) {
  console.log(key, value);
}
// z 33
// 1 100
// b 3
1
theVoogie

{5: 2, 2: 2, 1: 1}のようなオブジェクトを生成する代わりに

効果のある配列を生成する

[
   {key: 5, val: 2},
   {key: 2, val: 2},
   {key: 1, val: 1}
]

または...別の値またはキーでソート順を追跡します

1
Brad Kent

Idsでキーを設定した正規化配列でこの問題に遭遇しました>調べたところ、オブジェクトキーを使用して修正する方法はないことがわかりました。

私が行った解決策は、「sortIndex」フィールドを配置し、それを使用してリストをソートすることです。

1
cyianite

数値配列インデックスで作業しているときに、単にそれを行ってください

data      = {}
data[key] = value
0
bhavinjr

私はこれと同じ問題に遭遇し、それについて多くの検索をした後、私はこの動作を防ぐための解決策がキーを文字列にすることであることがわかりました。

そのように:

{"a": 2, "b": 2}
0
Marcos Mendes