【问题标题】:Merge JavaScript objects合并 JavaScript 对象
【发布时间】:2009-11-16 21:23:44
【问题描述】:

我读过另一个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。但首先:将它们合并为单个对象(数组)的最佳方法是什么?

【问题讨论】:

标签: javascript string-concatenation


【解决方案1】:

“合并”对象与将对象放入数组不同,后者是一种聚合。尽管它为您提供了一个可以传递的对象,但此聚合在结构上与合并对象不同。在访问新容器(一个数组)中的值时,聚合会增加一定的深度。这不同于合并会导致相同的容器,一个对象。

如果您使用的是 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]}];

【讨论】:

    【解决方案2】:

    这应该可行。

    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

    【讨论】:

    • 这是对象的集合或聚合,而不是合并。
    • 他在文章末尾提到了一个数组。
    • 哦,我明白他现在在说什么了。
    • 这仍然没有接近合并。
    【解决方案3】:

    如果你有多个 JSON 对象,你可以创建一个包含 JSON 对象:

    var containerJSON = {};
    

    并将该对象用作数组:

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

    然后在 PHP 中你可以使用 json_decode() 来取回你的数据。

    【讨论】:

    • 数组更适合这种情况。
    • 当您将数据作为数组发送到 php 时,您需要单独解码每个 JSON 对象。因此最好将它们放入 JSON“容器”对象中。
    【解决方案4】:

    这是一个简单的 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);
    

    这应该可以满足您的需要。

    【讨论】:

    • 您应该检查您的功能,addToJSON 未使用。
    • 此外,如果计算结果为 false0,则值可能会被覆盖。相反,您应该使用if ( typeof moveJSON[key] != "undefined" ) {
    猜你喜欢
    • 2015-11-19
    • 2013-10-29
    • 2020-09-12
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多