向对象添加元素
Posted
技术标签:
【中文标题】向对象添加元素【英文标题】:Adding elements to object 【发布时间】:2012-12-23 11:11:42 【问题描述】:我需要填充一个 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 中的内容。
用数组代替对象解决了我的问题,我在这里也使用了很多建议,谢谢大家!
【问题讨论】:
Add new element to existing object in javascript / jQuery的可能重复 Object.assign(target, source);可用于将源对象的所有属性复制到目标对象。 .push 给了我“不是函数”let result = rowData.slice(); result.forEach(e =>e.push(action: 'test');
标题令人困惑,因为这是关于将元素添加到数组而不是对象。我认为 js 中的一切都是对象,但仍然......
【参考方案1】:
您的元素不是数组,但是您的购物车需要是数组才能支持许多元素对象。代码示例:
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]"
【讨论】:
谢谢,但我的购物车现在不是数组,我不能做 cart.push :( 在这个操作之后我需要一个对象来使用 JSON.stringify(cart) @HypeZ 如果购物车是对象数组,您仍然可以对它进行字符串化。 再次感谢您!但是我的基础数据是对象类型的原因,开头是“cart = JSON.parse(jsonfile)”。我认为我不应该将json作为对象,将其转换为数组,添加元素,stringify .. 由于某种原因,我的对象只填充了最后一个元素。例如,我有 4 个不同的项目,但在一个对象中,所有 4 个元素都是 = 最后一个值我找到的解决方案是 create element = ;在 for 中,然后它的工作正常 @GorodeckijDimitrij 如果您重用相同的元素对象并使用新值重新填充它的键,那么您将修改一个相同的元素实例,一次又一次地将其推送到数组中。只需为您添加的每个元素使用一个新元素对象,这就是您在 for 循环范围内所做的。【参考方案2】:那一行
var element = ;
您将element
定义为普通对象。本机 JavaScript 对象没有 push()
方法。要向普通对象添加新项目,请使用以下语法:
element[ yourKey ] = yourValue;
另一方面,您可以将 element
定义为一个数组,使用
var element = [];
然后你可以使用push()
添加元素。
【讨论】:
element[ yourKey ] = yourValue;
是向对象添加元素的最佳方式。
但是您不能通过 element[ yourKey ] = yourValue; 授予对象中添加的元素的顺序;
@Pramesh Bajracharya 它不会向元素添加值,它只是将当前元素设置为该值。
@sommesh 你想如何保留副本?你可以做element[ yourkey ] = [ elementyourkey], yourNewValue ];
@sommesh 这会给你一个重复的键,根据定义,这在 JS 对象中是不可能的。你只能像我之前展示的那样为一个键收集多个值。【参考方案3】:
如果购物车必须存储为对象而不是数组(尽管我建议存储为 []),您可以随时更改结构以使用 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
【讨论】:
谢谢,但我的购物车需要是一个对象而不是数组:( 使用这样的对象的一个原因是,如果您需要删除项目。从对象中删除键比从数组中删除键容易得多。 如果 HypeZ 的数组注释让任何人失望,克雷格的回答没有添加数组,括号 [] 用于访问该属性。测试它here on jsfiddle 并阅读它here at Mozilla,这是Digital Ocean 的一篇很棒的文章,我希望我很久以前就遇到过。【参考方案4】:要附加到对象,请使用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
【讨论】:
这可能是最实用的做事方式,但是一个新来的 javascript 开发者可能不会理解这一点。 我试过了,但它会覆盖现有元素,因为两者都具有相同的名称element
,所以它将只有最后一个元素。【参考方案5】:
在原来的object
中添加新的键/对元素:
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']
【讨论】:
或者您可以使用扩展运算符 (...) 或 Object.assign() 方法const obj = a:1, b:2 ; const add = c:3, d:4, e: ['x','y','z'] ; let newObj = ...obj,...add;console.log(newObj); let newObj2 = Object.assign(obj,add);console.log(newObj);
是的,你是对的,但在这种特定情况下,我们的想法是避免创建新对象。所以,只修改原来的那个。当您拥有非常大的数据集并且不想创建其他对象时非常有用。【参考方案6】:
如果有用的话,我正在阅读与此尝试相关的内容。
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
注意元素添加了索引,并且还看到对象添加了一个新的长度属性。这对于查找对象的长度也很有用。这是因为push()
函数的通用性质
【讨论】:
【参考方案7】:你应该写var element = [];
在 javascript 中, 是一个空对象,
[]
是一个空数组。
【讨论】:
【参考方案8】:cart.push("element": id: id, quantity: quantity );
【讨论】:
不能做 cart.push 因为 cart 现在是一个对象! :( 它是一个对象而不是数组的任何具体原因? 因为我是从“cart = JSON.parse(jsonfile)”得到的,它给出了一个对象【参考方案9】: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;
此代码有效。
【讨论】:
【参考方案10】:试试这个:
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);
【讨论】:
【参考方案11】:如果有人想创建一个类似的 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;
);
【讨论】:
如何为您创建的新 JSON 结构添加值? @JudeFernandescart[key]=value
基本上是一个键值映射。如果答案有帮助,请点赞。谢谢!【参考方案12】:
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';
【讨论】:
虽然这是实现相同结果的一种方法,但这种解决方案并不简洁。【参考方案13】:对于仍在寻找解决方案的任何人,我认为对象应该存储在一个数组中,例如...
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。返回一个“元素”对象。当然,我们不必通过 id 来查找对象。我们可以使用任何其他属性来进行查找。
【讨论】:
【参考方案14】:我的建议是使用其他答案中已经提出的不同数据结构 - 它允许您推送 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);
【讨论】:
【参考方案15】:push 是数组的一种方法,所以对于 object,你可以得到最后一个元素的索引,你可以做和 push for object 一样的工作,如下所示
var lastIndex = Object.keys(element)[Object.keys(element).length-1];
然后将对象添加到元素的新索引
element[parseInt(lastIndex) +1] = id: id, quantity: quantity ;
【讨论】:
【参考方案16】:如果你不打算在 JS 中做循环,例如传递给 php 为你做循环
let decision =
decision[code+'#'+row] = event.target.value
这个概念可能有点帮助
【讨论】:
【参考方案17】:这是一个老问题,无论如何今天最好的做法是使用 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
【讨论】:
【参考方案18】:万一其他人需要这个,我终于找到了一个添加对象或对象数组的好方法:
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
]
);
【讨论】:
以上是关于向对象添加元素的主要内容,如果未能解决你的问题,请参考以下文章