2009-11-16 5 views
3

Я читал еще similiar question on SO, но на этот вопрос не было четкого ответа.Объединить объекты JavaScript

Я получил некоторые объекты 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 
} 

мне нужно, чтобы объединить их в один объект, который будет отправлять на PHP с помощью AJAX. Но сначала: как лучше всего объединить их в один объект (массив)?

+0

Этот вопрос похож на: http://stackoverflow.com/questions/1198962/merge-two-json-objects-programmatically? –

ответ

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, которая может оказаться полезной при создании объединенного объекта.

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

+1

Ха-ха, спасибо, стыдно за меня :) – richard

+0

Это коллекция или агрегация объектов, а не слияние. –

+0

Он упоминает массив в конце сообщения. – kemiller2002

0

Если у вас есть несколько объектов JSON, вы можете создать содержащий JSON объект:

var containerJSON = {}; 

И использовать этот объект как массив:

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

Тогда в PHP вас может использовать json_decode(), чтобы вернуть данные.

+3

В этом случае более подходящими являются массивы. –

+1

Когда вы отправляете данные в виде массива в php, вам нужно будет декодировать каждый объект JSON по отдельности. Поэтому лучше всего помещать их в объект контейнера JSON. –

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]}], и в качестве объекта 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

Это простой 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); 

Это должно делать то, что вам нужно.

+0

Вы должны проверить свою функцию, 'addToJSON' не используется. –

+0

Кроме того, значения могут быть перезаписаны, если они оцениваются как 'false' или' 0'. Вместо этого вы должны использовать 'if (typeof moveJSON [key]! =" Undefined ") {' –

Смежные вопросы