281

我需要填充一个 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 中的内容。

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

4

18 回答 18

359

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

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}]" 
于 2013-01-09T11:56:50.793 回答
201

与那一排

var element = {};

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

element[ yourKey ] = yourValue;

另一方面,您可以element使用

var element = [];

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

于 2013-01-09T11:57:45.520 回答
26

要附加到对象使用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}}

于 2019-04-25T13:26:09.780 回答
25

如果购物车必须存储为对象而不是数组(尽管我建议存储为 []),您始终可以更改结构以使用 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 } }
于 2013-01-09T12:21:06.933 回答
14

将新的键/对元素添加到原始元素中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'] }
于 2020-06-11T17:13:18.383 回答
10

如果有用,我正在阅读与此尝试相关的内容。

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()函数的通用性质

于 2019-08-08T13:04:23.207 回答
6

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

于 2013-01-09T11:55:27.333 回答
6
cart.push({"element":{ id: id, quantity: quantity }});
于 2013-01-09T11:58:04.643 回答
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;
}

此代码有效。

于 2017-07-20T13:57:08.867 回答
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);
于 2016-06-03T18:03:52.203 回答
3

如果有人想创建一个类似的 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;
                    });
于 2017-06-19T10:06:54.573 回答
2
 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';
于 2015-05-07T21:32:36.993 回答
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。返回一个“元素”对象。当然,我们不必通过 id 来查找对象。我们可以使用任何其他属性来进行查找。

于 2018-08-06T07:51:45.123 回答
2

我的建议是使用其他答案中已经提出的不同数据结构 - 它允许您推送 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);

于 2020-08-24T20:54:09.887 回答
1

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

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

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

element[parseInt(lastIndex) +1] = { id: id, quantity: quantity };
于 2017-08-11T11:16:50.653 回答
1

如果您不设计在 JS 中执行循环,例如传递给 PHP 为您执行循环

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

这个概念可能会有所帮助

于 2017-09-19T11:43:45.297 回答
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
于 2019-10-28T22:12:26.387 回答
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
    }
  ]
}); 
于 2021-05-13T14:01:16.423 回答