web-dev-qa-db-ja.com

ChromeおよびOperaインデックスASCによるJSONオブジェクトのソートを停止するにはどうすればよいですか?

問題があります。

Ajaxを使用して、次を使用して正しく形成されたJSONオブジェクトを送信しました。

            $.ajax({
                type: "POST", 
                url: SITE_URL+'/data.php',
                dataType: "json",
                data: { ajax: 1 },
                success: function(data) {
                    console.log(data);
                }
            });

ただし、OperaとChromeは、同じオブジェクトを受け取っても、オブジェクトを間違った順序で印刷します。どちらもID番号をそのままにしておくのではなく、ID番号でソートするようです。

この自動ソートを停止する方法はありますか?

編集、それがインデックス番号でソートされていることを見つけた後、私は最善の方法はobject_idを保存するためにインデックスを使用せず、代わりにオブジェクトを注文するID番号を保存することだと考えています。

しかし、ソートを停止する方法があるかどうかを知りたいです。

ありがとうございました

Edit2、私はこの方法でオブジェクトを乱用しているように感じるので、これを行う別の方法で作業することに注意したいだけです。ただし、なぜOpera and ChromeオブジェクトIDの順序を変更する権利があると感じています:

問題は、処理能力を節約しようとすることです。たとえば、IDを持つ人がいるとしましょう。

1.ジョン、2。フランク、3。サリー。ただし、これらの各ユーザーには、高さのプロパティセット(およびその他)があります。 1.John.180、2.Frank.220、3.Sally.150。処理を節約するために、私は人々の結果を身長でソートするように要求します。そのため、他のプロパティで2、1、3の配列を取得します。この配列をJSON化して、ブラウザーに送信します。

FFは新しい順序を保持しますPeople [1]はJohnのままですが、For n as personループでは順序が狂います。

これを回避できない場合は、SQLステージで並べ替えを行わずに、JSステージで配列にループと並べ替えを追加するだけで済みます。ページ。

どうもありがとう

60
Dorjan

さまざまなブラウザーがさまざまな方法でオブジェクトを処理しますが、私の欠点は、オブジェクトを作成した順序を参照すべきではない参照として使用しようとすることでした。

19
Dorjan

同じ問題があり、dmcのソリューションに従いましたが、int値の前にスペースを追加して文字列にしました。

別の数字以外の文字ではなくスペースを使用する利点は、その後POSTされた値を再度削除することなくmySQL検索句で直接使用できることです。

24
FarnhamBee

整数を文字列に変更しても機能しませんでした(Chrome、jQuery 1.7.1)。そのため、順序を維持するために(はい、オブジェクトの乱用です)、これを変更しました。

optionValues0 = {"4321": "option 1", "1234": "option 2"};

これに

optionValues0 = {"1": {id: "4321", value: "option 1"}, "2": {id: "1234", value: "option 2"}};
18
Michail

そのJSONがオブジェクトではなく配列である場合を除き、特定の順序でなければならないという標準はありません。ただし、データを取得するためにオブジェクトを反復処理する必要がないため、これは問題になりません。プロパティを参照するだけです。

14
James Long

一部のブラウザはintのキーをソートしますが、それを文字列に変更して後で元に戻すのは非常に簡単です。私の解決策はキーに「i」を追加することでした。各ブラウザで完璧に動作します:)

6
dmc

私は同じ「問題」を抱えており、コードに戻ってあまり変更したくありませんでした。少なくともGoogle Chromeは数値インデックスのみを再ソートします。インデックスが文字列である限り、「意図した」順序で表示されます。誰かがOperaでこれを確認してください。 ?

5
Alasjo

どのソリューションも私にとってはうまくいきませんでした(2017年8月)。文字列Chromeを使用し、Safari(他のブラウザでテストを行った)は文字列に基づいてソートしていました。代わりに、整数キーと値文字列を連結しました。

result[string_value + str(integer_key)] = string_value

この方法では、文字列が最初になり、ブラウザは自由にソートできます。次に、いくつかの簡単なロジックを使用して、キーと値を分離しました。

お役に立てれば。

2
user3167654

最善の方法は、連想配列をまったく使用しないことです。関連付けられた配列を送信する場合は、キーと値の2つの別々の配列として送信します。これを行うためのPHPコード:

    $arWrapper = array();
    $arWrapper['k'] = array_keys($arChoices);
    $arWrapper['v'] = array_values($arChoices);
    $json = json_encode($arWrapper);

そして、あなたがやりたいことを何でもする簡単なJavaScriptコード

            for (i=0; i < data['k'].length; i++) {
                console.log('key:' + data['k'][i] + ' val:' + data['v'][i]);
            }

私は同様の問題を抱えていました jQuery:$ .getJSONでデータを並べ替えChrome/IE?

1
Collector

Google Chrome(およびその他))をだまして数字ではなく文字列を持たせる必要があります。JSONを{"2423":'abc', "2555":'xyz'}に変更しても機能しません。

オブジェクトを機能させるには、「_ 2423」と「_2555」をオブジェクトのインデックスとして使用する必要がありました。

さらに、console.logへの出力のデバッグまたはfor x in yの使用により、_.eachメソッドに関して異なる結果が得られました(アンダースコアフレームワークを参照)。

JSFiddleで"_"とプレフィックスなし、for x in yループを使用してテスト/証明を確認できます。 http://jsfiddle.net/3f9jugtg/1/

1
DynamicDan

このコードを使用してこの問題を解決しました。

$('.edit_district').editable("/moderator/sale/edit_sale/", {
    data   : " {'_7':'10 street', '_9':'9 street', '_11':'park'}",
    type   : 'select',
    submit    : 'OK',
    onblur : 'submit'
});

およびscript.phpで:

...
case "id_district":

$district = Districts::GetDistrictByID(Database::getInstance(), (int)substr($value,1));

if($district instanceof District){
    $data["id_district"] = $district->id_district;
    echo $district->title;
}

break;

...
1
user1039177

JSON文字列パラメーターでオブジェクト識別子を作成します。自動ソートなしで機能します。

0
Alexej Nagel

私は同じ問題を抱えていて、それが何を引き起こしているのか、何が苦痛なのかを理解するのにしばらくかかりました。私はインデックスからIDを削除し、array_Pushを使用する代わりに:

$section[$s_id]['Type'] = $booktype;

など。

array_Push($sections, array('ID'=>$s_id, 
                            'CourseID'=>$courseid, 
                            'SectionName'=>$secname, 
                            'Order'=>$order, 
                            'Created'=>$created, 
                            'Description'=>$desc
                            ));

PHP新しいインデックスは既に順番に並んでいるので(112、56、411などではなく0、1、2、3など)なので、

0
AersolKing

レコードIDを使用して事後プロセスループでグループ化する必要がある場合があります。キー値を引用符で囲みます。または、キーをリセットする最終配列でarray_mergeを使用できます。

$processed_array = array(
  235=>array("id"=>235,"name"=>"Something"),
  27=>array("id"=>27,"name"=>"Something")
);

array_merge($processed_array);

Print_r($ processed_array);現在、次を返します。

$processed_array = array(
  0=>array("id"=>235,"name"=>"Something"),
  1=>array("id"=>27,"name"=>"Something")
);
0
Nick Johnson

クロムでも同じ問題があったので、イライラしていました。私はそれを特定の方法で送ります。なぜchromeただWordを受け入れられないのですか?「標準的な」方法がないと思いますが、その場合、なぜあなた自身の命令を課すのですか? ?

とにかく、オブジェクトを配列に変換して処理したので、

{ 0: "", 2: "Frame", 1: "Masonry" }

なりました

[[ 0, "" ], [ 2, "Frame" ], [ 1, "Masonry" ]]

JavaScriptを変更する必要がありましたが、完全に機能しました。

0
emery.noel

役立つ1つのトリックは次のとおりです。

Forループでデータを準備する際に、キーに「i」を追加する必要がありますが、これはトリックです。各ブラウザで完璧に動作します。

例えば ​​:

 for(var i=1;i<4;i++){

 data[''+i+''+your_random_generatedId+'']  = {"questionText":"","answer":"","options":"",noOfOptions:""};

 console.log(data[''+i+''+your_random_generatedId+'']); // This prints the log of each object inside data 

 }

 console.log(data); // This will print the Object without sorting

したがって、オブジェクトは次のようになります。

Object {156674: Object, 201705: Object, 329709: Object}

お役に立てれば :)

0
Maulik