我读过另一个similiar question on 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
}
我需要将它们合并到一个对象中,该对象将通过AJAX发送给PHP。但首先:将它们合并为单个对象(数组)的最佳方法是什么?
答案 0 :(得分:5)
“合并”对象与将对象放入数组(不同是聚合)不同。虽然它为您提供了一个传递的单个对象,但此聚合在结构上与合并对象不同。在访问新容器(即数组)中的值时,聚合会增加深度级别。这与合并导致同一容器即对象不同。
如果你正在使用Dojo,那么你可以做到:
var mergedObject = dojo.mixin(object1, object2);
否则,这是合并两个或多个对象的简单方法:
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]}]
{1}}以及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]}];
答案 1 :(得分:3)
这应该有用。
var array = []
array.push(yourObject);
这会将您的对象放入一个数组中,如果您将同一个对象的集合放入一个数组中,则应该使用该数组。
将不同的值合并到一个对象中:
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中的函数,这可能对创建合并对象很有用。
答案 2 :(得分:0)
如果您有多个JSON对象,则可以创建包含JSON对象:
var containerJSON = {};
将该对象用作数组:
containerJSON[0] = moveJSON_1;
containerJSON[1] = moveJSON_2;
然后在PHP中,您可以使用json_decode()来获取数据。
答案 3 :(得分:-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);
那应该做你需要的。