向对象中添加元素

我需要填充一个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时,我得到了错误“对象没有方法push”,我认为我做了一些非常错误的事情,因为我没有告诉“元素”在任何地方。

我该怎么做呢?

编辑:抱歉,我有很多混乱在我的头。

我以为从JSON.parse中获取数据时只能获得对象类型,但我得到了我首先放在JSON中的内容。

用数组代替对象解决了我的问题,我用了很多建议,谢谢大家!

1491650 次浏览

你应该写var element = [];
在javascript中{}是一个空对象,[]是一个空数组

你的元素不是一个数组,但是你的购物车需要是一个数组以支持许多元素对象。代码示例:

var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push(element);

如果你想让cart是一个{ 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}]"

下面的代码行将element定义为普通对象。

let element = {}

这种带有{}的JavaScript对象没有push()方法。要像这样向对象添加新项,使用以下语法:

element[yourKey] = yourValue

把它们放在一起,请看下面的例子:

let element = {} // make an empty object


/* --- Add Things To The Object --- */


element['active'] = true // 'active' is the key, and 'true' is the value
console.log(element) // Expected result -> {type: true}




element['state'] = 'slow' // 'state' is the key and 'slow' is the value
console.log(element) // Expected result -> {type: true, state: 'slow'}

另一方面,如果将对象定义为数组(即使用[]而不是{}),则可以使用push()方法添加新元素。

cart.push({"element":{ id: id, quantity: quantity }});

如果购物车必须存储为对象而不是数组(尽管我建议存储为[]),你总是可以改变结构,使用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 } }
 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';

试试这个:

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);

如果有人想要创建一个类似的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;
});
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;
}

这段代码是有效的。

Push是数组的一个方法,所以对于object,你可以得到最后一个元素的索引,你可以做和下面Push for object相同的工作

var lastIndex = Object.keys(element)[Object.keys(element).length-1];

然后将object添加到element的新索引中

element[parseInt(lastIndex) +1] = { id: id, quantity: quantity };

如果你不设计在JS中做循环,例如传递给PHP为你做循环

let decision = {}
decision[code+'#'+row] = event.target.value

这个概念可能会有所帮助

对于仍然在寻找解决方案的人来说,我认为对象应该存储在一个数组中,就像…

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赋给它。返回一个“element”对象。当然,我们不需要使用id来查找对象。我们可以用任何其他的属性来寻找。

要添加到对象,请使用Object.assign

var ElementList ={}


function addElement (ElementList, element) {
let newList = Object.assign(ElementList, element)
return newList
}
console.log(ElementList)

输出:

{“元素”:{" id ": 10,“数量”:1},“元素”:{" id ": 11,“数量”:2}}

我正在阅读一些与此相关的东西,如果有用的话。

1.在对象中定义一个push函数。

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属性。这对于计算物体的长度也很有用。这是因为push()函数的泛型性质

这是一个老问题,无论如何,今天的最佳实践是使用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

在原来的object中添加新的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'] }

我的建议是使用已经在其他答案中提出的不同的数据结构-它允许您在卡上进行推送。元素,并允许展开卡片属性:

let card = {
elements: [
{"id":10,"quantity":1}
],


//other card fields like 'owner' or something...
}


card.elements.push({"id":22,"quantity":3})


console.log(card);

为了防止其他人需要这个,我终于找到了一个添加对象或对象数组的好方法:

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
}
]
});