向对象添加元素

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 结构添加值? @JudeFernandes cart[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
    
  ]
); 

【讨论】:

以上是关于向对象添加元素的主要内容,如果未能解决你的问题,请参考以下文章

向vector对象中添加元素

向js数组中添加元素的3种方法

无法向(猫鼬)对象添加其他元素

java新手求助-急急急-关于向JList中添加元素

使用 JavaScript 向 JSON 对象添加新属性(元素)

在Java中向对象添加多个元素