Thêm các yếu tố vào đối tượng


222

Tôi cần phải điền một tệp json, bây giờ tôi có một cái gì đó như thế này:

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

Và tôi cần thêm một "yếu tố" khác. Bước đầu tiên của tôi là đưa json đó vào một loại Object bằng cách sử dụng cart = JSON.parse, bây giờ tôi cần thêm phần tử mới. Tôi nghĩ tôi phải sử dụng cart.pushđể thêm một yếu tố khác, tôi đã thử điều này:

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

Nhưng tôi đã gặp lỗi "Đối tượng không có phương pháp đẩy" khi tôi cố gắng thực hiện element.pushvà tôi nghĩ rằng tôi đang làm gì đó RẤT sai vì tôi không nói "phần tử" ở bất cứ đâu.

Làm thế nào tôi có thể làm điều đó?

Chỉnh sửa: xin lỗi tất cả tôi đã có rất nhiều nhầm lẫn trong đầu.

Tôi nghĩ rằng tôi chỉ có thể nhận được loại đối tượng khi lấy dữ liệu JSON.parse, nhưng tôi nhận được những gì tôi đặt trong JSON ở vị trí đầu tiên.

Đặt mảng thay vì đối tượng giải quyết vấn đề của tôi, tôi cũng đã sử dụng rất nhiều đề xuất ở đây, cảm ơn tất cả các bạn!



Object.assign (mục tiêu, nguồn); có thể được sử dụng để sao chép tất cả các thuộc tính từ một đối tượng nguồn sang một đối tượng đích.
David Spector

Câu trả lời:


287

Phần tử của bạn không phải là một mảng, tuy nhiên giỏ hàng của bạn cần phải là một mảng để hỗ trợ nhiều đối tượng phần tử. Mã ví dụ:

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

Nếu bạn muốn giỏ hàng là một mảng các đối tượng trong biểu mẫu { element: { id: 10, quantity: 1} }thì thực hiện:

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

JSON.stringify() đã được đề cập như một mối quan tâm trong bình luận:

>> JSON.stringify([{a: 1}, {a: 2}]) 
      "[{"a":1},{"a":2}]" 

2
cảm ơn bạn, nhưng giỏ hàng của tôi bây giờ không phải là một mảng và tôi không thể thực hiện cart.push :( tôi cần một đối tượng để sử dụng JSON.opesify (giỏ hàng) sau thao tác này
HypeZ

@HypeZ Bạn vẫn có thể xâu chuỗi giỏ hàng nếu đó là một mảng các đối tượng.
Konstantin Dinev

cám ơn bạn một lần nữa! Nhưng dữ liệu cơ sở của tôi là nguyên nhân loại đối tượng của "cart = JSON.parse (jsonfile)" ngay từ đầu .. tôi không nghĩ rằng tôi nên lấy json làm đối tượng, chuyển đổi nó thành mảng, thêm phần tử, xâu chuỗi ..
HypeZ

vì lý do nào đó, đối tượng của tôi chỉ chứa đầy yếu tố cuối cùng. ví dụ: tôi có 4 mục khác nhau, nhưng trong một đối tượng, tất cả 4 phần tử là = giải pháp giá trị cuối cùng tôi tìm thấy là tạo phần tử = {}; bên trong, sau đó nó hoạt động đúng
Gorodeckij Dimitrij

1
@GorodeckijDimitrij Nếu bạn đang sử dụng lại cùng một đối tượng phần tử và bạn lặp lại các khóa của nó với các giá trị mới, thì bạn sẽ sửa đổi một và cùng một phần tử của phần tử, đẩy nó một lần nữa vào một mảng. Chỉ cần sử dụng một đối tượng phần tử mới cho mỗi phần tử bạn đang thêm, đó là những gì bạn đã thực hiện trong phạm vi của vòng lặp for.
Konstantin Dinev

160

Với hàng đó

var element = {};

bạn xác định elementlà một đối tượng đơn giản. Đối tượng JavaScript gốc không có push()phương thức. Để thêm các mục mới vào một đối tượng đơn giản, hãy sử dụng cú pháp này:

element[ yourKey ] = yourValue;

Mặt khác, bạn có thể định nghĩa elementlà một mảng bằng cách sử dụng

var element = [];

Sau đó, bạn có thể thêm các yếu tố bằng cách sử dụng push().


4
element[ yourKey ] = yourValue;là cách tốt nhất người ta có thể thêm phần tử vào một đối tượng.
Pramesh Bajracharya

Nhưng bạn không thể cấp thứ tự của phần tử được thêm vào trong đối tượng với phần tử [yourKey] = yourValue;
RollerCosta

2
@Pramesh Bajracharya Nó không THÊM giá trị cho phần tử, nó chỉ đặt phần tử hiện tại thành giá trị đó.
Hasen

1
@sommesh bạn muốn giữ bản sao như thế nào? bạn có thể làmelement[ yourkey ] = [ element{yourkey], yourNewValue ];
Sirko

1
@sommesh điều này sẽ cung cấp cho bạn một khóa trùng lặp, theo định nghĩa là không thể có trong một đối tượng JS. bạn chỉ có thể thu thập nhiều giá trị cho một khóa như tôi đã hiển thị trước đó.
Sirko

21

Nếu giỏ hàng phải được lưu trữ dưới dạng đối tượng chứ không phải mảng (Mặc dù tôi khuyên bạn nên lưu trữ dưới dạng []), bạn luôn có thể thay đổi cấu trúc để sử dụng ID làm khóa:

var element = { quantity: quantity };
cart[id] = element;

Điều này cho phép bạn thêm nhiều mặt hàng vào giỏ hàng như vậy:

cart["1"] = { quantity: 5};
cart["2"] = { quantity: 10};

// Cart is now:
// { "1": { quantity: 5 }, "2": { quantity: 10 } }

cảm ơn bạn, nhưng giỏ hàng của tôi cần phải là một đối tượng chứ không phải là một mảng :(
HypeZ

3
Một lý do để sử dụng một đối tượng như thế này, là nếu bạn cần xóa các mục. Xóa khóa khỏi một đối tượng dễ dàng hơn nhiều so với xóa khóa khỏi một mảng.
bryc

Trong trường hợp bình luận mảng của HypeZ loại bỏ bất kỳ ai, câu trả lời của Craig không thêm một mảng, dấu ngoặc [] được sử dụng để truy cập vào thuộc tính. Kiểm tra nó ở đây trên jsfiddle và đọc về nó ở đây tại Mozilla và đây là một bài viết tuyệt vời tại Digital Ocean mà tôi ước rằng tôi đã đi qua từ lâu.
Hastig Zusammenstellen

12

Để thêm vào một đối tượng sử dụng Object.assign

var ElementList ={}

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

Đầu ra:

{"phần tử": {"id": 10, "số lượng": 1}, "phần tử": {"id": 11, "số lượng": 2}}


Đây có lẽ là cách hiệu quả nhất để làm mọi thứ, nhưng một nhà phát triển javascript mới có thể sẽ không hiểu điều này.
codeninja

1
Tôi đã thử nó nhưng nó sẽ ghi đè phần tử hiện có, vì cả hai đều có cùng tên element, vì vậy nó sẽ chỉ có phần tử cuối cùng.
Haritsinh Gohil

6

bạn nên viết var element = [];
bằng javascript {}là một đối tượng trống và []là một mảng trống.


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

4
không thể làm cart.push vì bây giờ giỏ hàng là một đối tượng! :(
HypeZ

bất kỳ lý do cụ thể tại sao nó là một đối tượng chứ không phải là mảng?
Cris

bởi vì tôi đã nhận được nó từ "cart = JSON.parse (jsonfile)" và nó đưa ra một đối tượng
HypeZ

6

Tôi đã đọc một cái gì đó liên quan đến thử này nếu nó hữu ích.

1. Xác định chức năng đẩy bên trong một đối tượng.

let obj={push:function push(element){ [].push.call(this,element)}};

Bây giờ bạn có thể đẩy các phần tử như một mảng

obj.push(1)
obj.push({a:1})
obj.push([1,2,3])

Điều này sẽ tạo ra đối tượng này

obj={
 0: 1
 1: {a: 1}
 2: (3) [1, 2, 3]
 length: 3
}

Lưu ý các phần tử được thêm bằng chỉ mục và cũng thấy rằng có một thuộc tính độ dài mới được thêm vào đối tượng. Điều này sẽ hữu ích để tìm độ dài của đối tượng. Điều này hoạt động vì tính chất chung của push()hàm


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

mã này đã hoạt động.


3

Thử cái này:

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

Thêm các yếu tố khóa / cặp mới vào đối tượng ban đầu:

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 giá trị mới:

{a: 1, b: 2, c: 3, d: 4, e: ["x", "y", "z"] }

2

Nếu bất cứ ai tìm cách tạo một JSON tương tự, chỉ cần không sử dụng cartnhư một mảng, thì đây là:

Tôi có một mảng các đối tượng myArrnhư:

var myArr = [{resourceType:"myRT",
            id: 1,
            value:"ha"},
            {resourceType:"myRT",
            id: 2,
            value:"he"},
            {resourceType:"myRT",
            id: 3,
            value:"Li"}];

và tôi sẽ cố gắng tạo JSON với cấu trúc sau:

{
 "1":{"resourceType":"myRT","id":"1","value":"ha"},
 "2":{"resourceType":"myRT","id":"2","value":"he"},
 "3":{"resourceType":"myRT","id":"3","value":"Li"}
}

bạn chỉ có thể làm-

var cart = {};
myArr.map(function(myObj){
                    cart[myObj.id]= myObj;
                    });

Làm thế nào để bạn thêm một giá trị cho cấu trúc JSON mới mà bạn đã tạo?
Jude Fernandes

1
@JudeFernandes cart[key]=valuevề cơ bản là bản đồ giá trị chính. Làm upvote nếu câu trả lời là hữu ích. Cảm ơn!
Saad Patel

2

Đối với bất cứ ai vẫn đang tìm kiếm một giải pháp, tôi nghĩ rằng các đối tượng nên được lưu trữ trong một mảng như ...

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

Sau đó, khi bạn muốn sử dụng một yếu tố làm đối tượng, bạn có thể làm điều này ...

var element = cart.find(function (el) { return el.id === "id_that_we_want";});

Đặt một biến tại "id_that_we_want" và cung cấp cho nó id của phần tử mà chúng ta muốn từ mảng của chúng ta. Một đối tượng "elemnt" được trả lại. Tất nhiên chúng tôi không phải cho chúng tôi id để tìm đối tượng. Chúng tôi có thể sử dụng bất kỳ tài sản khác để tìm thấy.


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

HOẶC LÀ:

var obj = {'key':'value'};

obj.key2 = 'value2';

Mặc dù đây là một cách để đạt được kết quả tương tự, nhưng giải pháp này không gọn gàng.
warunapww

1

đẩy là một phương thức của mảng, vì vậy đối với đối tượng bạn có thể lấy chỉ mục của phần tử cuối cùng và có thể bạn có thể thực hiện công việc tương tự như đẩy đối tượng như dưới đây

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

sau đó thêm đối tượng vào chỉ mục mới của phần tử

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

1

nếu bạn không thiết kế để thực hiện vòng lặp với trong JS, ví dụ chuyển qua PHP để thực hiện vòng lặp cho bạn

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

khái niệm này có thể giúp một chút


1

Đây là một câu hỏi cũ, dù sao hôm nay cách tốt nhất là sử dụng 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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.