使用相同的名称标记扩展对象

时间:2015-04-19 09:38:02

标签: javascript jquery javascript-objects

我有一个对象

$a = {'fruit' :
    { 'name' : 'apple', 'cost' : '5.00' }
}

和另一个对象

$b = {'fruit' :
    { 'name' : 'pear', 'cost' : '4.00' }
}

如何使用jQuery或任何JS库在结果对象中制作同一对象的2个副本?即我希望最终的对象是

$basket = {'basket' :
    {'fruit' :
        { 'name' : 'pear', 'cost' : '4.00' }
    },
    {'fruit' :
        { 'name' : 'apple', 'cost' : '5.00' }
    }
}

但是,jQuery库只将第二个对象的属性合并到第一个。

4 个答案:

答案 0 :(得分:1)

您不能在单个对象上拥有两个具有相同名称的属性;但是,你可以拥有一个带有数组值的单个属性。

如果您想从$a$b变量构建它:



var $a = {
  'fruit': {
    'name': 'apple',
    'cost': '5.00'
  }
};

var $b = {
  'fruit': {
    'name': 'pear',
    'cost': '4.00'
  }
};

var $basket = {
  'fruit': [$a.fruit, $b.fruit]
};

snippet.log($basket.fruit[0].name); // apple
snippet.log($basket.fruit[1].name); // pear

<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;

如果您只想宣布不包含$a$b的购物篮:

&#13;
&#13;
var $basket = {
  'fruit': [
    {
      'name': 'apple',
      'cost': '5.00'
    },
    {
      'name': 'pear',
      'cost': '4.00'
    }
  ]
};

snippet.log($basket.fruit[0].name); // apple
snippet.log($basket.fruit[1].name); // pear
&#13;
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
&#13;
&#13;
&#13;


附注:您不需要在对象初始化程序中围绕属性名称',因为它们符合属性名称文字的规则(但'是无害的)。< / p>

附注2:如果您希望cost的值为数字,则不希望'围绕它们。

附注3:请注意,我已在变量名称前添加了var。你的代码成了The Horror of Implicit Globals的牺牲品,创建了全局变量(不像PHP中的本地变量),因为它没有声明它们。

附注4:JavaScript代码中通常不会使用$为变量添加前缀。你可以,但它不常见,除了有些人在使用jQuery指示变量引用jQuery对象时这样做。

答案 1 :(得分:1)

对象属性标签应该是唯一的。创建一个对象,其中属性basket是[fruit]对象的数组,您可以迭代该篮子。例如:

var a = {'fruit' :
           { name : 'apple', cost : 5.00 },
          'misc' :
           { name: 'decorative fruit basket', cost: 7.89 }    
        };
var b = {'fruit' :
    { name : 'pear', cost : 4.00 }
}

var c = {basket: [a, b]};
var result = document.querySelector('#result');

result.innerHTML = JSON.stringify(c, null, ' ');

var i = c.basket.length;
while (i--) {
  if (c.basket[i].fruit.name === 'pear') {
    result.innerHTML += '\n**Found pear, cost is: '+ c.basket[i].fruit.cost.toFixed(2);
  }
}
<pre id="result"></pre>

答案 2 :(得分:0)

是。您需要一个项目列表(作为您的购物篮)。 看看这个:

{
  "basket": [
    {
      "fruit": {
        "name": "pear",
        "cost": "4.00"
      }
    },
    {
      "fruit": {
        "name": "apple",
        "cost": "5.00"
      }
    }
  ]
}

您可以使用JSON模式生成器:http://jsonschema.net/ - 它会检查有效性,更重要的是生成可用于验证对象的模式。

其他人也指出,您的数据结构可能需要重新思考。你可以,例如将水果的名称存储为字典条目的关键字,如下所示:

{
  "basket": [
    {
      "pear": "4.00"
    },
    {
      "apple": "5.00"
    }
  ]
}

示例性地,这给出了以下模式:

{
  "$schema": "http://json-schema.org/draft-04/schema#",
  "id": "/",
  "type": "object",
  "properties": {
    "basket": {
      "id": "basket",
      "type": "array",
      "items": [
        {
          "id": "0",
          "type": "object",
          "properties": {
            "pear": {
              "id": "pear",
              "type": "string"
            }
          }
        }
      ]
    }
  }
}

答案 3 :(得分:0)

尝试

var a = {
  "fruit": {
    "name": "apple",
    "cost": "5.00"
  }
};

var b = {
  "fruit": {
    "name": "pear",
    "cost": "4.00"
  }
};

var basket = {};

basket[0] = a;
basket[1] = b;

/*

// `basket`

{
    "0": {
        "fruit": {
            "name": "apple",
            "cost": "5.00"
        }
    },
    "1": {
        "fruit": {
            "name": "pear",
            "cost": "4.00"
        }
    }
}
*/

document.getElementsByTagName("pre")[0]
.innerText = JSON.stringify(basket, null, 4);
<pre></pre>