我需要填充一个json文件,现在我有这样的东西:
{"element":{"id":10,"quantity":1}}
我需要添加另一个“元素”。我的第一步是使用cart = JSON.parse
将json放在Object类型中,现在我需要添加新元素。
我想我必须使用cart.push
添加另一个元素,我试过这个:
var element = {};
element.push({ id: id, quantity: quantity });
cart.push(element);
但是当我尝试element.push
时,我得到错误“对象没有方法推送”,我认为我做了一些非常错误的事情,因为我没有在任何地方告诉“元素”。
我该怎么做?
编辑:对不起,我头脑中有很多困惑。
我认为从JSON.parse
获取数据时我只能得到对象类型,但我首先得到了JSON中的内容。
放置数组而不是对象解决了我的问题,我在这里也提到了很多建议,谢谢大家!
答案 0 :(得分:230)
您的元素不是数组,但是您的购物车需要是一个数组才能支持许多元素对象。代码示例:
var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push(element);
如果您希望购物车成为{ element: { id: 10, quantity: 1} }
形式的对象数组,请执行:
var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push({element: element});
JSON.stringify()
在评论中提到了一个问题:
>> JSON.stringify([{a: 1}, {a: 2}])
"[{"a":1},{"a":2}]"
答案 1 :(得分:124)
使用该行
var element = {};
您将element
定义为普通对象。本机JavaScript对象没有push()
方法。要将新项添加到普通对象,请使用以下语法:
element[ yourKey ] = yourValue;
另一方面,您可以使用
将element
定义为数组
var element = [];
然后您可以使用push()
添加元素。
答案 2 :(得分:17)
如果购物车必须存储为对象而不是数组(虽然我建议存储为[]),您可以随时更改结构以使用ID作为密钥:
var element = { quantity: quantity };
cart[id] = element;
这允许您将多个项目添加到购物车中,如下所示:
cart["1"] = { quantity: 5};
cart["2"] = { quantity: 10};
// Cart is now:
// { "1": { quantity: 5 }, "2": { quantity: 10 } }
答案 3 :(得分:5)
你应该写var element = [];
在javascript {}
中是一个空对象,[]
是一个空数组。
答案 4 :(得分:5)
在原始对象中添加新的key / pair元素:
const obj = { a:1, b:2 }
const add = { c:3, d:4, e: ['x','y','z'] }
Object.entries(add).forEach(([key,value]) => { obj[key] = value })
obj新值:
{a: 1, b: 2, c: 3, d: 4, e: ["x", "y", "z"] }
答案 5 :(得分:4)
cart.push({"element":{ id: id, quantity: quantity }});
答案 6 :(得分:3)
试试这个:
var data = [{field:"Data",type:"date"}, {field:"Numero",type:"number"}];
var columns = {};
var index = 0;
$.each(data, function() {
columns[index] = {
field : this.field,
type : this.type
};
index++;
});
console.log(columns);
答案 7 :(得分:3)
function addValueInObject(object, key, value) {
var res = {};
var textObject = JSON.stringify(object);
if (textObject === '{}') {
res = JSON.parse('{"' + key + '":"' + value + '"}');
} else {
res = JSON.parse('{' + textObject.substring(1, textObject.length - 1) + ',"' + key + '":"' + value + '"}');
}
return res;
}
此代码已经完成。
答案 8 :(得分:2)
如果有人想要创建类似的JSON,只需不使用cart
作为数组,就可以了:
我有一个对象数组myArr
:
var myArr = [{resourceType:"myRT",
id: 1,
value:"ha"},
{resourceType:"myRT",
id: 2,
value:"he"},
{resourceType:"myRT",
id: 3,
value:"Li"}];
我将尝试使用以下结构创建一个JSON:
{
"1":{"resourceType":"myRT","id":"1","value":"ha"},
"2":{"resourceType":"myRT","id":"2","value":"he"},
"3":{"resourceType":"myRT","id":"3","value":"Li"}
}
你可以简单地做 -
var cart = {};
myArr.map(function(myObj){
cart[myObj.id]= myObj;
});
答案 9 :(得分:2)
要附加到对象,请使用Object.assign
var ElementList ={}
function addElement (ElementList, element) {
let newList = Object.assign(ElementList, element)
return newList
}
console.log(ElementList) //{"element":{"id":10,"quantity":1},"element":{"id":11,"quantity":2}}
答案 10 :(得分:1)
push是一个数组的方法,所以对于对象,你可以得到最后一个元素的索引,你可以做与推送对象相同的工作,如下所示
server{
listen 80;
listen [::]:80;
server_name 192.168.56.101 192.168.101.100 localhost;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /var/www/html;
}
location ~ \.php$ {
try_files $uri =404;
fastcgi_pass unix:/var/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}
然后将对象添加到元素的新索引
var lastIndex = Object.keys(element)[Object.keys(element).length-1];
答案 11 :(得分:1)
我的主张是使用其他答案中已经提出的不同数据结构-它允许您压入card.elements并扩展卡属性:
let card = {
elements: [
{"id":10,"quantity":1}
],
//other card fields like 'owner' or something...
}
card.elements.push({"id":22,"quantity":3})
console.log(card);
答案 12 :(得分:1)
如果正在尝试,我正在阅读与此尝试相关的内容。
1。在对象内部定义推送功能。
let obj={push:function push(element){ [].push.call(this,element)}};
现在,您可以像数组一样推送元素
obj.push(1)
obj.push({a:1})
obj.push([1,2,3])
这将产生这个物体
obj={
0: 1
1: {a: 1}
2: (3) [1, 2, 3]
length: 3
}
请注意,元素中添加了索引,并且还看到在对象上添加了新的length属性。这对于查找对象的长度也很有用。由于{{1} }函数
答案 13 :(得分:1)
对于仍在寻找解决方案的任何人,我认为对象应该存储在类似...的数组中。
var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push(element);
然后,当您要将元素用作对象时,可以执行此操作...
var element = cart.find(function (el) { return el.id === "id_that_we_want";});
在“ id_that_we_want”处放置一个变量,并为其提供我们要从数组中获取的元素的ID。返回一个“ elemnt”对象。当然,我们不需要ID即可找到对象。我们可以使用其他任何属性进行查找。
答案 14 :(得分:1)
如果您没有设计在JS中进行循环,例如传递给PHP为你做循环
let decision = {}
decision[code+'#'+row] = event.target.value
这个概念可能会有所帮助
答案 15 :(得分:1)
function addValueInObject(value, object, key) {
var addMoreOptions = eval('{"' + key + '":' + value + '}');
if(addMoreOptions != null) {
var textObject = JSON.stringify(object);
textObject = textObject.substring(1,textObject.length-1);
var AddElement = JSON.stringify(addMoreOptions);
object = eval('{' + textObject +','+ AddElement.substring(1,AddElement.length-1) + '}');
}
return object;
}
addValueInObject('sdfasfas', yourObject, 'keyname');
或者:
var obj = {'key':'value'};
obj.key2 = 'value2';
答案 16 :(得分:0)
这是一个古老的问题,无论如何,今天的最佳实践是使用 Object.defineProperty
const object1 = {};
Object.defineProperty(object1, 'property1', {
value: 42,
writable: false
});
object1.property1 = 77;
// throws an error in strict mode
console.log(object1.property1);
// expected output: 42
答案 17 :(得分:0)
如果其他人需要这个,我终于找到了添加对象或对象数组的好方法:
var myobj = {}
// These two options only work for single-valued keys, not arrays or objects
myobj["a"] = 1
myobj.b = 2
// This one works for everyting:
Object.assign(myobj, {"key": "value"}); // single-value
// Add object
Object.assign(myobj, {"subobj":
{
"c": 3
}
});
// Add array of objects
Object.assign(myobj, {"subarr":
[
{
"d": 4,
},
{
"e": 5
}
]
});