Объединить объекты JavaScript - PullRequest
3 голосов
/ 17 ноября 2009

Я прочитал еще один похожий вопрос по 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
}

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

Ответы [ 4 ]

5 голосов
/ 17 ноября 2009

«Объединение» объектов отличается от помещения объектов в массив, который является агрегацией. Хотя он предоставляет вам один объект для обхода, этот агрегат структурно отличается от объединенного объекта. Агрегирование добавляет уровень глубины при доступе к значениям в новом контейнере, который является массивом. Это отличается от объединения, которое приводит к тому же контейнеру, объекту.

Если вы используете 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]}];
3 голосов
/ 17 ноября 2009

Это должно работать.

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

0 голосов
/ 17 ноября 2009

Это простая функция 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 голосов
/ 17 ноября 2009

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

var containerJSON = {};

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

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

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

...