2009-11-16 6 views
3

J'ai lu un autre similiar question on SO mais il n'y avait pas de réponse claire à cette question.Fusionner des objets JavaScript

J'ai des objets JavaScript qui ressemblent à ceci:

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 
} 

je dois les fusionner en un seul objet, qui sera envoyé à PHP via AJAX. Mais d'abord: quelle est la meilleure façon de les fusionner en un seul objet (tableau)?

+0

Cette question est similaire à: http://stackoverflow.com/questions/1198962/merge-two-json-objects-programmatically? –

Répondre

3

Cela devrait fonctionner.

var array = [] 

array.push(yourObject); 

cela va mettre votre objet dans un tableau, qui devrait être utilisée que si vous mettiez d'une collection du même objet en un seul.

pour fusionner des valeurs différentes en un seul objet:

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; 

}

Voici un lien qui décrit également des arguments qui passent comme tableau dans une fonction JavaScript qui pourrait être utile pour créer l'objet fusionné.

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

+1

Haha merci, honte à moi :) – richard

+0

Ceci est une collection ou une agrégation d'objets, pas une fusion. –

+0

Il mentionne un tableau à la fin du message. – kemiller2002

0

Si vous avez plusieurs objets JSON, vous pouvez créer un objet contenant JSON:

var containerJSON = {}; 

Et utiliser cet objet comme un tableau:

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

Puis en PHP vous pouvez utiliser json_decode() pour récupérer vos données.

+3

Les tableaux sont plus appropriés dans ce cas. –

+1

Lorsque vous envoyez les données sous forme de tableau à php, vous devez décoder chaque objet JSON individuellement. Par conséquent, il est préférable de les placer dans un objet "conteneur" JSON. –

5

La "fusion" d'objets est différente de la mise d'objets dans un tableau, qui est une agrégation. Bien qu'il vous fournisse un seul objet à transmettre, cet agrégat est structurellement différent d'un objet fusionné. L'agrégation ajoute un niveau de profondeur lors de l'accès aux valeurs dans le nouveau conteneur, qui est un tableau. Ceci est différent de la fusion qui résulte dans le même conteneur, un objet.

Si vous utilisez Dojo, que vous pouvez simplement faire:

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

Sinon, voici un moyen simple de fusionner deux ou plusieurs objets:

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}} 

Comme vous le verrez, ce qui est très différent d'une agrégation:

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]}]; 

Ainsi, la différence est que mergedObject ressemble {a:4, b:2, c:[1,2,3], d:{a:1}}, où la propriété d est accédée en tant que mergedObject.d, par opposition à aggregation, qui ressemble à [{a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]}] et où la propriété d est accédée en tant que aggregation[1].d.

Il convient également de noter qu'une fonction explicite pour l'agrégation n'est pas nécessaire grâce à la syntaxe de définition de tableau littéral disponible en JavaScript

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

est équivalent à

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

C'est un simple fonction mixin qui ne remplacera pas les propriétés des objets existants

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); 

Cela devrait faire ce dont vous avez besoin.

+0

Vous devriez vérifier votre fonction, 'addToJSON' est inutilisé. –

+0

De même, les valeurs peuvent être remplacées si elles sont évaluées à "false" ou "0". Au lieu de cela, vous devriez utiliser 'if (typeof moveJSON [clé]! =" Undefined ") {' –