我有一个对象
$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库只将第二个对象的属性合并到第一个。
答案 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;
如果您只想宣布不包含$a
和$b
的购物篮:
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;
附注:您不需要在对象初始化程序中围绕属性名称'
,因为它们符合属性名称文字的规则(但'
是无害的)。< / 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>