4

SOに関する別の同様の質問を読みましたが、その質問には明確な答えがありませんでした。

次のような JavaScript オブジェクトがいくつかあります。

var moveJSON = {
    'name'      : move[0].innerHTML,
    'info'      : move[1].innerHTML,
    'power'     : move[2].innerHTML,
    'accuracy'  : move[3].innerHTML,
    'type'      : move[4].innerHTML,
    'category'  : move[5].innerHTML,
    'pp_min'    : move[6].innerHTML,
    'pp_max'    : move[7].innerHTML
}

それらを 1 つのオブジェクトにマージし、AJAX 経由で PHP に送信する必要があります。しかし最初に: それらを単一のオブジェクト (配列) にマージする最良の方法は何ですか?

4

4 に答える 4

5

オブジェクトを「マージ」することは、オブジェクトを集合体である配列に入れることとは異なります。単一のオブジェクトを渡すことができますが、この集約はマージされたオブジェクトとは構造的に異なります。集計は、配列である新しいコンテナー内の値にアクセスする際の深さのレベルを追加します。これは、同じコンテナー (オブジェクト) になるマージとは異なります。

Dojo を使用している場合は、次のようにします。

var mergedObject = dojo.mixin(object1, object2);

それ以外の場合は、2 つ以上のオブジェクトをマージする簡単な方法を次に示します。

var merge = function() {
    var result = {},
        length = arguments.length,
        object = null,
        key    = null;

    if ( length < 2 ) {
        throw "Must merge two or more objects";
    }

    for ( var i=0; i<length; ++i ) {
        object = arguments[i];
        for ( var key in object ) {
            if ( !object.hasOwnProperty(key) ) { continue; }
            result[key] = object[key];
        }
    }
    return result;
};

var mergedObject = merge({a:1}, {b:2, c:3, d: {a: 1}}, {a: 2, c:[1,2,3]});
// mergedObject looks like {a:4, b:2, c:[1,2,3], d:{a:1}}

ご覧のとおり、これは集計とは大きく異なります。

var aggregate = function() {
    if ( length < 2 ) {
        throw "Must aggregate two or more objects";
    }

    // The following can be simplified to 
    //   return Array.prototype.slice.call(arguments);
    // but is left in a more explicit manner to illustrate the difference

    var result = [],
        length = arguments.length;

    for ( var i=0; i<length; ++i ) {
        if ( arguments.hasOwnProperty(i) ) {
            result.push(arguments[i]);
        }
    }

    return result;
};

var aggregation = aggregate({a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]});
// aggregation looks like [{a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]}];

したがって、違いは、mergedObjectのように見え{a:4, b:2, c:[1,2,3], d:{a:1}}、 プロパティdが としてアクセスされるmergedObject.dのとは対照的に aggregation、 のように見え[{a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]}]、 プロパティdが としてアクセスされることaggregation[1].dです。

JavaScript で利用可能なリテラル配列定義構文のおかげで、集約のための明示的な関数は必要ないことにも注意してください。

var aggregation = aggregate({a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]});

と同等です

var aggregation = [{a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]}];
于 2009-11-16T22:28:54.390 に答える
4

これはうまくいくはずです。

var array = []

array.push(yourObject);

これにより、オブジェクトが配列に配置されます。これは、同じオブジェクトのコレクションを 1 つに配置する場合に使用する必要があります。

異なる値を 1 つのオブジェクトにマージするには:

function makeObject(){
        var obj = {};

 obj['info']  = somevalue;    //arguments [0] maybe
 obj['power']  = somevalue;    
 obj['accuracy']   = somevalue;
 obj['type']       = somevalue;
 obj['category']   = somevalue;
 obj['pp_min']     = somevalue;
 obj['pp_max']    = somevalue;

return obj;

}

これは、配列などの引数を JavaScript の関数に渡すことも説明しているリンクです。これは、マージされたオブジェクトの作成に役立つ可能性があります。

http://www.cherny.com/webdev/60/javascript-function-arguments-default-values-passing-objects-and-overloading

于 2009-11-16T21:26:29.033 に答える
0

複数の JSON オブジェクトがある場合は、含まれる JSON オブジェクトを作成できます。

var containerJSON = {};

そのオブジェクトを配列として使用します。

containerJSON[0] = moveJSON_1;
containerJSON[1] = moveJSON_2;

次に、PHP で json_decode() を使用してデータを取得できます。

于 2009-11-16T21:42:00.417 に答える
-1

これは、既存のオブジェクト プロパティを上書きしない単純な mixin 関数です。

var mixin = function(addToJSON, someOtherJSON) {
  for(var key in someOtherJSON) {
     // don't overwrite 
     if(!moveJSON[key]) {
       moveJSON[key] = someOtherJSON[key]; 
     }
  }
};

var otherJSON = {'someOtherStuff': someOtherMoves[0].innerHTML};

mixin(moveJSON, otherJSON);

それはあなたが必要とすることをするはずです。

于 2009-11-16T22:46:37.110 に答える