Thêm một phần tử mảng mới vào một đối tượng JSON


120

Tôi có một đối tượng định dạng JSON mà tôi đọc từ tệp JSON mà tôi có trong một biến có tên là teamJSON, trông như thế này:

 {"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}

Tôi muốn thêm một mục mới vào mảng, chẳng hạn như

{"teamId":"4","status":"pending"}

kết thúc với

{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"},{"teamId":"4","status":"pending"}]}

trước khi ghi lại vào tệp. Cách tốt để thêm vào phần tử mới là gì? Tôi đã đến gần nhưng tất cả các dấu ngoặc kép đã được thoát. Tôi đã tìm kiếm một câu trả lời tốt trên SO nhưng không ai hoàn toàn bao gồm trường hợp này. Bất kỳ trợ giúp được đánh giá cao.


6
yourObj.theTeam.push({"teamId":"4","status":"pending"});
PSL

2
"JSON" không phải là một đối tượng - nó là một ký hiệu.
Brad Christie

1
Khi bạn đọc đối tượng JSON từ tệp, nó đang được hiểu là JSON hay một chuỗi? Nếu đó là một chuỗi, bạn cần phân tích cú pháp chuỗi dưới dạng JSON trước tiên thì bạn có thể thực hiện những gì mà nhận xét và câu trả lời khác đang đề xuất.
Đánh dấu

3
@Charles đọc tiêu đề của bạn và sau đó kiểm tra lại nhận xét của bạn.
Brad Christie

1
@ CharlesWyke-Smith Loại teamJSONbiến của bạn là gì? Nó là một chuỗi JSON, tức là '{"theTeam":[...]}'hay một đối tượng thực tế theo nghĩa đen? Gợi ý: sử dụngconsole.log(typeof teamJSON)
Phil

Câu trả lời:


233

JSON chỉ là một ký hiệu ; để thực hiện thay đổi bạn muốn parseđể bạn có thể áp dụng các thay đổi cho Đối tượng JavaScript gốc , sau đó stringifyquay lại JSON

var jsonStr = '{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}';

var obj = JSON.parse(jsonStr);
obj['theTeam'].push({"teamId":"4","status":"pending"});
jsonStr = JSON.stringify(obj);
// "{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"},{"teamId":"4","status":"pending"}]}"

16
+1 để chỉ ra điều này cần phải được phân tích cú pháp thành một đối tượng để được thao tác trước.
Brad Christie

3
Anh ấy nói rằng anh ấy đã có đối tượng trong một biến có tên teamJSON. Không có điểm nào là một chuỗi được đề cập
Phil

6
@Phil: Nếu là JSON, thì đó là một chuỗi. Nếu không, nó không phải là JSON.
user2736012 19/09/13

1
Các dấu ngoặc kép thực sự khiến tôi tự hỏi liệu JSON có được mã hóa hai lần hay không.
user2736012 19/09/13

24
Paul, đó là một câu trả lời rất xây dựng. Nó giải quyết sự thiếu sót trong tuyên bố vấn đề mà không coi thường áp phích gốc. Nó phân định rõ ràng hơn ranh giới giữa hoạt động trên các đối tượng javascript và biểu diễn văn bản JSON của các đối tượng đó. Tôi nghĩ điều cần thiết là phải hiểu rằng một khi JSON đã được phân tích cú pháp, chúng ta đang hoạt động trên các đối tượng javascript thuần túy - thực tế là chúng ban đầu đến từ JSON là không liên quan. Dù sao, đọc câu trả lời của bạn là một luồng gió mới sau tất cả những bình luận mang tính xúc phạm khiến OP cảm thấy như một tên ngốc.
Larry Hector

20
var Str_txt = '{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}';

Nếu bạn muốn thêm ở vị trí cuối cùng thì hãy sử dụng:

var parse_obj = JSON.parse(Str_txt);
parse_obj['theTeam'].push({"teamId":"4","status":"pending"});
Str_txt = JSON.stringify(parse_obj);
Output //"{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"},{"teamId":"4","status":"pending"}]}"

Nếu bạn muốn thêm ở vị trí đầu tiên, hãy sử dụng mã sau:

var parse_obj = JSON.parse(Str_txt);
parse_obj['theTeam'].unshift({"teamId":"4","status":"pending"});
Str_txt = JSON.stringify(parse_obj);
Output //"{"theTeam":[{"teamId":"4","status":"pending"},{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}"

Bất kỳ ai muốn thêm vào một vị trí nhất định của mảng hãy thử cách này:

parse_obj['theTeam'].splice(2, 0, {"teamId":"4","status":"pending"});
Output //"{"theTeam":[{"teamId":"1","status":"pending"},{"teamId":"2","status":"member"},{"teamId":"4","status":"pending"},{"teamId":"3","status":"member"}]}"

Khối mã trên thêm một phần tử sau phần tử thứ hai.


1

Đầu tiên chúng ta cần phân tích cú pháp đối tượng JSON và sau đó chúng ta có thể thêm một mục.

var str = '{"theTeam":[{"teamId":"1","status":"pending"},
{"teamId":"2","status":"member"},{"teamId":"3","status":"member"}]}';

var obj = JSON.parse(str);
obj['theTeam'].push({"teamId":"4","status":"pending"});
str = JSON.stringify(obj);

Cuối cùng chúng ta JSON.stringify các obj lại JSON


Điều gì sẽ xảy ra nếu JSON của chúng ta không có tên như theTeam, mà thay vào đó chỉ chứa các nút với các phần tử teamId & status? vì vậy của tôi sẽ giống như sau: var str = '[{"teamId": "1", "status": "pending"}, {"teamId": "2", "status": "member"}, {"teamId ":" 3 "," trạng thái ":" thành viên "}] ';
Shafique

0

Ví dụ ở đây là một phần tử như nút để thêm mặt hàng vào giỏ và các thuộc tính thích hợp để lưu trong localStorage.

'<a href="#" cartBtn pr_id='+e.id+' pr_name_en="'+e.nameEn+'" pr_price="'+e.price+'" pr_image="'+e.image+'" class="btn btn-primary"><i class="fa fa-shopping-cart"></i>Add to cart</a>'

var productArray=[];


$(document).on('click','[cartBtn]',function(e){
  e.preventDefault();
  $(this).html('<i class="fa fa-check"></i>Added to cart');
  console.log('Item added ');
  var productJSON={"id":$(this).attr('pr_id'), "nameEn":$(this).attr('pr_name_en'), "price":$(this).attr('pr_price'), "image":$(this).attr('pr_image')};


  if(localStorage.getObj('product')!==null){
    productArray=localStorage.getObj('product');
    productArray.push(productJSON);  
    localStorage.setObj('product', productArray);  
  }
  else{
    productArray.push(productJSON);  
    localStorage.setObj('product', productArray);  
  }


});

Storage.prototype.setObj = function(key, value) {
    this.setItem(key, JSON.stringify(value));
}

Storage.prototype.getObj = function(key) {
    var value = this.getItem(key);
    return value && JSON.parse(value);
}

Sau khi thêm đối tượng JSON vào Array, kết quả là (trong LocalStorage):

[{"id": "99", "nameEn": "Product Name1", "price": "767", "image": "1462012597217.jpeg"}, {"id": "93", "nameEn" : "Tên sản phẩm2", "giá": "76", "hình ảnh": "1461449637106.jpeg"}, {"id": "94", "nameEn": "Tên sản phẩm 3", "giá": "87" , "image": "1461449679506.jpeg"}]

sau hành động này, bạn có thể dễ dàng gửi dữ liệu đến máy chủ dưới dạng Danh sách trong Java

Mã đầy đủ ví dụ ở đây

Làm cách nào để lưu trữ một giỏ hàng đơn giản bằng localStorage?


0

Trong trường hợp của tôi, đối tượng JSON của tôi không có bất kỳ Mảng hiện có nào trong đó, vì vậy tôi phải tạo phần tử mảng trước và sau đó phải đẩy phần tử.

  elementToPush = [1, 2, 3]
  if (!obj.arr) this.$set(obj, "arr", [])
  obj.arr.push(elementToPush)  

(Câu trả lời này có thể không liên quan đến câu hỏi cụ thể này, nhưng có thể giúp ích cho người khác)


0

Giả sử chúng ta đã có dữ liệu trong biến alreadyData;

var alreadyData=[{"id":"99","nameEn":"Product Name1","price":"767","image":"1462012597217.jpeg"},{"id":"93","nameEn":"Product Name2","price":"76","image":"1461449637106.jpeg"},{"id":"94","nameEn":"Product Name3","price":"87","image":"1461449679506.jpeg"}];

var fields = []; //new array
var json = JSON.parse(alreadyData); //just parse in one variable
var json = JSON.parse(tableColumns);
for (var i = 0; i < json.length; i++) {
    fields.push(json[i]);//push data in fields
} 
fields.push({ 'id':33, 'nameEn': 'Singh', 'price': '222','image': '1462012597217.jpeg' }); // its new data
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.