Mesclar objetos JavaScript
-
20-09-2019 - |
Pergunta
Eu li outro pergunta similar em So Mas não havia uma resposta clara nessa pergunta.
Eu tenho alguns objetos JavaScript que se parecem com o seguinte:
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
}
Eu preciso mesclá -los em um objeto, que será enviado ao PHP via Ajax. Mas primeiro: qual é a melhor maneira de mesclá -los em um único objeto (matriz)?
Solução
Isso deve funcionar.
var array = []
array.push(yourObject);
Isso colocará seu objeto em uma matriz, que deve ser usada se você estivesse colocando uma coleção do mesmo objeto em um.
Para mesclar valores diferentes em um objeto:
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;
}
Aqui está um link que também descreve argumentos de aprovação como a matriz em uma função em JavaScript que pode ser útil na criação do objeto mesclado.
Outras dicas
Os objetos "mesclagem" são diferentes de colocar objetos em uma matriz, que é uma agregação. Embora forneça um único objeto a ser transmitido, esse agregado é estruturalmente diferente de um objeto mesclado. A agregação adiciona um nível de profundidade ao acessar valores no novo contêiner, que é uma matriz. Isso é diferente da fusão, o que resulta no mesmo contêiner, um objeto.
Se você está usando dojo, você pode fazer:
var mergedObject = dojo.mixin(object1, object2);
Caso contrário, aqui está uma maneira simples de fundir dois ou mais objetos:
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}}
Como você verá, isso é muito diferente de uma agregação:
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]}];
Então a diferença é que mergedObject
parece {a:4, b:2, c:[1,2,3], d:{a:1}}
, onde propriedade d
é acessado como mergedObject.d
, em oposição a aggregation
, que parece [{a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]}]
e onde propriedade d
é acessado como aggregation[1].d
.
Deve -se notar também que uma função explícita para agregação não é necessária graças à sintaxe da definição de matriz literal disponível em javascript
var aggregation = aggregate({a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]});
é equivalente a
var aggregation = [{a:1}, {b:2, c:3, d: {a: 1}}, {a: 4, c:[1,2,3]}];
Se você possui vários objetos JSON, pode criar um objeto JSON contendo:
var containerJSON = {};
E use esse objeto como uma matriz:
containerJSON[0] = moveJSON_1;
containerJSON[1] = moveJSON_2;
Em seguida, no PHP, você pode usar JSON_DECODE () para recuperar seus dados.
Esta é uma função simples de mixina que não substituirá as propriedades de objeto existentes
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);
Isso deve fazer o que você precisa.