向对象添加元素


222

我需要填充一个json文件,现在我有了类似的东西:

{"element":{"id":10,"quantity":1}}

我需要添加另一个“元素”。我的第一步是使用将该json放入Object类型cart = JSON.parse,现在我需要添加新元素。我以为我必须使用cart.push添加另一个元素,我尝试了这个:

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

但是,当我尝试执行操作时element.push,出现错误“对象没有方法推送” ,并且我认为我做错了什么,因为我没有在任何地方告诉“元素”。

我怎样才能做到这一点?

编辑:对不起,我脑子里有些混乱。

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

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



Object.assign(目标,源); 可用于将所有属性从源对象复制到目标对象。
大卫·史派克

Answers:


287

您的元素不是数组,但是购物车必须是数组才能支持许多元素对象。代码示例:

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}]" 

2
谢谢,但是我的购物车现在不是数组,我不能做cart.push :(我在执行此操作后需要一个对象才能使用JSON.stringify(cart)
HypeZ 2013年

@HypeZ如果购物车是对象数组,您仍然可以对其进行字符串化。
康斯坦丁·迪涅夫

再次感谢你!但是我的基本数据是对象类型的起因是“购物车= JSON.parse(jsonfile)”。.我不认为我应该将json作为对象,将其转换为数组,添加元素,进行字符串化。
HypeZ 2013年

由于某种原因,我的对象仅填充了最后一个元素。例如,我有4个不同的项目,但是在一个对象中,所有4个元素都是=我发现的最后一个值解决方案是create element = {}; 内部,然后正常工作
Gorodeckij Dimitrij

1
@GorodeckijDimitrij如果您正在重复使用同一元素对象,并用新值填充它的键,那么您将修改一个元素的相同实例,并将它一次又一次地推入数组。只需为要添加的每个元素使用一个新的元素对象,这就是您在for循环范围内所做的事情。
Konstantin Dinev

160

与那排

var element = {};

您定义element为普通对象。本机JavaScript对象没有push()方法。要将新项目添加到普通对象,请使用以下语法:

element[ yourKey ] = yourValue;

另一方面,您可以element使用

var element = [];

然后,您可以使用添加元素push()


4
element[ yourKey ] = yourValue;是将元素添加到对象的最佳方法。
Pramesh Bajracharya

但是您不能通过element [yourKey] = yourValue;来授予对象中添加的元素的顺序。
RollerCosta

2
@Pramesh Bajracharya不会将值添加到元素,它只是将当前元素设置为该值。
哈森

1
@sommesh您想如何保留重复项?你可以做到element[ yourkey ] = [ element{yourkey], yourNewValue ];
Sirko '19

1
@sommesh这将为您提供一个重复的密钥,根据定义,这在JS对象中是不可能的。您只能像我之前显示的那样为一个键收集多个值。
锡尔科

21

如果购物车必须存储为对象而不是数组(尽管我建议存储为[]),则始终可以更改结构以将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 2013年

3
使用这种对象的原因之一是,是否需要删除项目。从对象中删除键比从数组中删除键容易得多。
bryc 2015年

万一HypeZ的数组注释使任何人不满意,Craig的答案没有添加数组,请使用方括号[]来访问该属性。在jsfiddle上进行测试,然后在Mozilla 上进行阅读,这是Digital Ocean上的一篇很棒的文章,我希望我很早以前就读过。
哈斯蒂格·祖萨曼斯泰伦(Hastig Zusammenstellen)

12

附加到对象使用 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开发人员可能不会理解。
codeninja

1
我试过了,但是它将覆盖现有元素,因为两者都具有相同的名称element,因此它将仅具有最后一个元素。
Haritsinh Gohil

6

您应该用var element = [];
javascript 写的{}是一个空对象,并且[]是一个空数组。


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

4
不能做cart.push,因为购物车现在是对象!:(
HypeZ

为什么它是对象而不是数组的任何特定原因?
2012年

因为我是从“购物车= JSON.parse(jsonfile)”中获得的,所以它提供了一个对象
HypeZ 2013年

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
}

注意元素被添加了索引,并且还看到有一个新的length属性添加到对象中,这对于查找对象的长度也很有用,这是因为push()函数的通用性质


5
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;
}

此代码有效。


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

3

在原始对象中添加新的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"] }

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

如何为您创建的新JSON结构添加值?
裘德·费尔南德斯

1
@JudeFernandes cart[key]=value基本上是一个键值图。如果答案有帮助,请进行投票。谢谢!
萨德·帕特尔

2

对于仍在寻找解决方案的任何人,我认为对象应该存储在数组中,例如...

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即可找到对象。我们可以使用任何其他属性进行查找。


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

尽管这是获得相同结果的一种方法,但这种解决方案并非整洁。
warunapww 2015年

1

push是数组的一种方法,因此对于对象,您可以获取最后一个元素的索引,并且您可以执行与对对象的push相同的工作,如下所示

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

然后将对象添加到元素的新索引

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

1

如果您不打算在JS中做循环,例如传递给PHP为您做循环

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

这个概念可能会有所帮助


1

这是一个老问题,无论如何,今天的最佳实践是使用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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.