質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

1回答

1460閲覧

V7というJavaScripエンジンのオブジェクトの順番

tsukiji73

総合スコア8

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/09/26 14:42

###V7というJavaScriptエンジンを試しているのですが、
cesanta/v7 · GitHub

読み込んだJSONなどのオブジェクトのプロパティが逆順になるのですが、、、
これは仕様なのでしょうか、
あるいはコンパイルオプションなどで解決できるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

オブジェクトのプロパティに順番はない

まず、オブジェクトのプロパティを列挙するコードを書いてください。
「cesanta/v7」を使用したことはありませんが、ECMAScript 仕様に準ずれば for-in, Object.keys の列挙順は実装依存です。

JavaScript

1var obj = {a: 1, b: 2, c: 3}, 2 keys = []; 3 4console.log(Object.keys(obj)); 5 6for (var key in obj) { 7 keys.push(key); 8} 9 10console.log(keys);

そもそも論としてオブジェクトのプロパティには順番の概念がありません。
順番が重要であれば、配列か new Map を使ってください。

new Map を JSON に変換する

定義順で列挙する場合に new Map を使う方法があります。
new Map はそのまま JSON 化出来ないので二次元配列に変換する事で実装し、JSONから new Map に戻すときには逆の手順で戻します。

JavaScript

1function mapToArray (map) { // for ES5 2 var entries = map.entries(), 3 array = [], 4 item; 5 6 while (item = entries.next(), !item.done) { 7 array.push(item.value); 8 } 9 10 return array; 11} 12 13var map1 = new Map([['a', 1], ['b', 2], ['c', 3]]), 14 JSONString1 = JSON.stringify(mapToArray(map1)), 15 JSONString2, map2; 16 17map2 = new Map(JSON.parse(JSONString1)); 18JSONString2 = JSON.stringify(mapToArray(map1)); 19 20console.log(map1); // Map {"a" => 1, "b" => 2, "c" => 3} 21console.log(map2); // Map {"a" => 1, "b" => 2, "c" => 3} 22console.log(JSONString1); // [["a",1],["b",2],["c",3]] 23console.log(JSONString2); // [["a",1],["b",2],["c",3]] 24console.log(JSONString1 === JSONString2); // true

Re: tsukiji73 さん

投稿2016/09/26 15:03

編集2016/09/28 04:03
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tsukiji73

2016/09/27 16:57 編集

コードとしてはこんな感じです。 #V8の場合 $ ./v8test 'JSON.stringify({a: 1, b: 2, c: 3})' {"a":1,"b":2,"c":3} #v7の場合 $ ./v7test 'JSON.stringify({a: 1, b: 2, c: 3})' {"c":3,"b":2,"a":1} 論としてというのは分かりますが、使いづらいなと思いまして、、、
think49

2016/09/28 04:05 編集

> 論としてというのは分かりますが、使いづらいなと思いまして、、、 JSON.stringifyはシリアライズしているだけですので使い勝手に影響するのはそこではないと思います。 生成したJSON文字列をJSON.parseしてどのようにプロパティ列挙するか、が問題です。 {}は列挙順がランダムでも困らないように設計するのが一般的ですね。 (2016/09/28 13:03 追記) new Mapで実装する方法を親記事に追記しました。
tsukiji73

2016/09/28 14:31

JSON.stringifyはもちろん表示用に使っているだけです。 v7の場合、(オブジェクトを定義した時点で、)(ランダムでもなく)逆順になるところが、う〜ん、、、という、、、 例えばJSONファイルを読み込んだ結果なども必ず逆になっているので、、、 "Map"ついては、ご教示ありがとうございました。 ただ、v7で使えないのと、、、 そもそも配列との違いが分かりません。
think49

2016/09/28 14:53 編集

> JSON.stringifyはもちろん表示用に使っているだけです。 であれは、「実際にどのようなコードで運用しているか」が問題になると思います。 繰り返しますが、順序が定義順であっても逆順であってもランダムであっても問題ないようにコードを組めば解決できます。 MapにはPolyfillがあります。 Mapは指定したkeyの値をget/setする機能がありますので配列よりもオブジェクト初期化子に近い機能となります。 配列では同じ動作を実現する為にユーザ定義関数を通す必要があります。 var array = [["a",1],["b",2],["c",3]]; get(array, 'a'); // 1
tsukiji73

2016/09/30 18:27

> > JSON.stringifyはもちろん表示用に使っているだけです。 > であれは、「実際にどのようなコードで運用しているか」が問題になると思います。 もー何を言ってるのかわかりません。 そもそも質問(v7の使い方)に対する解答ではないので、、、
maisumakun

2020/09/01 07:39 編集

> そもそも質問(v7の使い方)に対する解答ではないので、、、 「順番がどうなろうが、意図したように動作するJavaScriptコードを書く」というのも1つの「使い方」の提示だと考えます。
maisumakun

2020/09/01 07:51

(このエンジンはES 5.1準拠なので、まだ順番が不定の時代のものです)
Zuishin

2020/09/01 07:58

なるほど。それじゃしょうがないですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問