6

この時点で、オブジェクトとは何か、配列とは何か、JSON とは何かについて少し混乱しています。誰かが2つの構文の違いを説明できますか? それぞれにアイテムを追加する方法、各タイプをマージする方法などは? この関数を取得して、JSON オブジェクト (私は思う) から新しい情報を取得し、それをいくつかの新しい情報とマージしようとしています。この情報は、PHP スクリプトに渡されて処理されます。

コンソール出力は次のとおりです。

{"public":{"0":["el29t7","3bmGDy"]}} 
{"public":"[object Object][object Object]"} 

私が使用しているJSは次のとおりです。

/* Helper function to clean up any current data we have stored */
function insertSerializedData(ids, type) {
    // Get anything in the current field
    current_data = $('#changes').val();
    if (!current_data) {
        var data = {};
        data[index++] = ids;
        var final_data = {};
        final_data[type] = data;
        $('#changes').val(JSON.stringify(final_data));
    } else {
        current_data = JSON.parse(current_data);
        var data = {};
        data[index++] = ids;
        // Does the index exist?
        if (type in current_data) {
            var temp_data = current_data[type];
            current_data[type] = temp_data + data;
        } else {
            current_data[type] = data;
        }
        //var extra_data = {};
        //extra_data[type] = data;
        //$.merge(current_data, extra_data);
        $('#changes').val(JSON.stringify(current_data));
    }
    console.log($('#changes').val());
}

アイデアは、キー(公開、またはその他のもの)がまだ存在しない場合、配列の配列を指すようにすることです。ただし、存在する場合は、配列の配列のものを新しい配列とマージする必要があります。例えば:

私が持っている場合

{"public":{"0":["el29t7","3bmGDy"]}}  

そしてそれをマージしたい

["aj19vA", "jO71Ba"] 

最終結果は次のようになります。

{"public":{"0":["el29t7","3bmGDy"], "1":["aj19vA", "jO71Ba"]}} 

どうすればこれを行うことができますか?ありがとう

4

5 に答える 5

8

優れた 2 部構成の質問。全体として、最初の質問が複雑であるため、2 番目の質問は自明ではありません。

質問1:

オブジェクトとは何か、配列とは何か、JSON とは何か。誰かが2つの構文の違いを説明できますか?

質問2:

それぞれにアイテムを追加する方法、

質問 3:

各タイプをマージする方法などは?

答え 1:

JavaScript は当初の予想よりも柔軟であるため、これはよくあるつまずき点です。これが曲線です。

JavaScript では、すべてがオブジェクトです。

したがって、それぞれのコードは次のとおりです。

//What is an object?
var obj = { };                

var obj2 = { member:"value", myFunction:function(){} }

上は空のオブジェクトです。次に、変数と関数を持つ別のオブジェクト。それらはオブジェクトリテラルと呼ばれます。

//What is an array 
var array1 = [ ] ;     

var array2 = [0,1,2,3,4];

上は空の配列です。次に、5 つの整数を含む別の配列。

これが混乱を招く曲線です。

//Get elements from each of the prior examples.
var x = obj2["member"];
var y = array2[1];

何???オブジェクトと配列の両方が括弧で値にアクセスしていますか? これは、両方がオブジェクトであるためです。これは、高度なコードを書くための優れた柔軟性であることが判明しました。配列はオブジェクトです。

//JSON とは?

JSON は JavaScript Object Notation の略です。ご想像のとおりです。すべてがオブジェクトです... それはまた、 JavaScript で (一般的に) 実際に使用されるのではなく{ }; JavaScript との間でデータを転送するために使用されるため、異なります。ファイル転送形式です。

var JSONObject = {"member":"value"};

前の例との唯一の違いは引用符です。基本的に、オブジェクト リテラルを文字列としてラップして、サーバーに転送したり、サーバーに戻したり、再解釈したりすることが非常に簡単にできるようにします。カスタム解析する必要がないため、XML より優れています。または. stringify()_ ParseJSON()ググってください。要点は... たとえば、サーバーや CouchDB データベースに転送するために、JSON をオブジェクト リテラルの JS オブジェクトに変換したり、JS オブジェクト リテラルを JSON に変換したりできます。

接線失礼します。

答え 2:

それぞれにアイテムを追加する方法は?ここで、曲線が煩わしくなくなり、素晴らしいものになり始めます! すべてがオブジェクトなので、すべてほぼ同じです。

//Add to an object
var obj {member1:"stringvalue"}
obj.member2 = "addme";    //That is it!

//Add to an array
var array1 [1,2,3,4,5];
array1[0] = "addme";

array[6] = null;

//We shouldn't mix strings, integers, and nulls in arrays, but this isn't a best-practice tutorial.

JS オブジェクトの構文を思い出してください。そうすれば、まったく新しい柔軟なオブジェクトの世界が開かれることに気付くかもしれません。しかし、それは少しかかるかもしれません。

回答 3: ああ、そうです... マージの方法です。

2 つの配列をマージする真剣な (非常に多くの) 方法があります。それはまさにあなたが必要とするものに依存します。並べ替え、複製、連結...いくつかあります。

これが答えです!

更新: 美しい多次元配列を作成する方法。

//Multiple Dimension Array
var array1 = [1,2,3];
var array2 = [3,4];

var arraysinArray = [array1,array2]; //That is it!

これは再び曲線です。これはオブジェクト内にある可能性があります。

var obj{
   array1:[1,2,3],
   array2:[3,4]
}

JavaScript は強力なものです。良くなる。: )

お役に立てば幸いです。ナッシュ

于 2012-06-23T04:17:08.647 に答える
1

この場合、JavaScript のオブジェクト リテラル{}は、PHP の連想配列のようなものと考えてください。

それを考えると、「配列の配列」は実際には次のようになります(上記の目的の出力を使用):

{public: [["el29t7","3bmGDy"], ["aj19vA", "jO71Ba"]]}

ここでは、値が 2 次元配列である "public" という名前の単一のプロパティを持つオブジェクト リテラルがあります。

上記を変数に割り当てると、次のようにpush別の配列を「パブリック」に割り当てることができます。

var current_data = {public: [["el29t7","3bmGDy"], ["aj19vA", "jO71Ba"]]};

// Using direct property access
current_data.public.push(["t9t9t9", "r4r4r4"]);

// Or using bracket notation
current_data["public"].push(["w2w2w2", "e0e0e0"]);

current_dataの値は次のとおりです。

{public: [
  ["el29t7","3bmGDy"], 
  ["aj19vA", "jO71Ba"], 
  ["t9t9t9", "r4r4r4"], 
  ["w2w2w2", "e0e0e0"]
]}

したがって、「パブリック」は長さが 4 の配列です。

current_data.public[0]; // ["el29t7","3bmGDy"]
current_data.public[1]; // ["aj19vA", "jO71Ba"]
current_data.public[2]; // ["t9t9t9", "r4r4r4"]
current_data.public[3]; // ["w2w2w2", "e0e0e0"]

MDN には Array に関する非常に優れたドキュメントがあり、必要な他の機能についての洞察が得られます。 https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array

于 2012-06-23T04:23:11.920 に答える
0

1 つ目は配列を含むオブジェクトで、2 つ目は配列です。

ディスプレイ出力を示すデモ http://jsfiddle.net/GjQCV/

var object={"public":{"0":["el29t7","3bmGDy"]}};
var arr=["aj19vA", "jO71Ba"] ;
/* use object notation to add new property and value which is the array*/
object.public[1]=arr;
于 2012-06-23T03:53:01.887 に答える
0

{"0": ...}オブジェクトではなく真の配列であれば、はるかに自然ですが、とにかく:

function maxKey(b) {
    var max;
    for( var key in b )
        var max = key;
    return max;
}
function merge(a,b) {
    for( var key in a ) {
        b[key] = b[key] ? (b[key][maxKey(b)+1]=a[key], b[key]) : a[key];
    }
    return b;
}

これは、次の整数インデックスに挿入することを前提としていることに注意してください

于 2012-06-23T03:53:15.580 に答える
0
  1. 配列は特定の種類の Javascript オブジェクトです
  2. JSON は Javascript オブジェクトを表す方法です (したがって、配列などを表すことができます)。
  3. オブジェクトはより一般的で、JSON として表すことができる単純なオブジェクトにすることも、関数とプロトタイプを含めることもできます。

したがって、これは配列の配列ではありません ( myobj["0"]のような JSON 表記を使用してアイテムにアクセスします):

{"0":["el29t7","3bmGDy"], "1":["aj19vA", "jO71Ba"]}

これは配列の配列です。つまり、pushメソッドを使用してアイテムを追加し、 myobj[0]のような配列表記を使用してアイテムにアクセスできます。

[ ["el29t7","3bmGDy"], ["aj19vA", "jO71Ba"] ]

必要な構造は次のようなものです。

var myobj = { "public": [ ["key", "value"], ["key", "value"] ] }

次に、新しいアイテムを追加/マージする場合は、次のように記述します。

if (myobj["public"] != null) {
    myobj["public"].push(["newkey", "newval"]);
} else {
    myobj["public"] = ["newkey", "newval"];
}
于 2012-06-23T03:54:48.737 に答える