使用jQuery从JavaScript对象添加/删除项目


82

我有一个JavaScript对象,如下所示:

var data = {items: [
    {id: "1", name: "Snatch", type: "crime"},
    {id: "2", name: "Witches of Eastwick", type: "comedy"},
    {id: "3", name: "X-Men", type: "action"},
    {id: "4", name: "Ordinary People", type: "drama"},
    {id: "5", name: "Billy Elliot", type: "drama"},
    {id: "6", name: "Toy Story", type: "children"}
]};

如果我想在此列表中添加/删除项目,我将如何使用jQuery进行处理?客户希望此列表是可动态修改的。


2
这不是JSON。这是一个对象字面量:benalman.com/news/2010/03/theres-no-such-thing-as-a-json并且针对JSON对象的讨伐还在进行中……。
Felix Kling 2010年

4
@Matt:的确如此。JSON是一种文本数据格式。而且即使在字符串中,被引用的代码也不是JSON(因为JSON需要在属性名称上加上双引号)。
TJ Crowder 2010年

6
感谢您的启发。它肯定看起来像一个JSON对象!再次感谢!
Bug磁铁

3
@Bug:的JSON表示法{items: []}如下所示:{"items": []}。这不是完全一样的东西(非常相似;同样,JSON是您使用的内容的子集,即对象文字符号)。当你反序列化JSON,结果是一个对象图(例如,在JavaScript中,这是一个JavaScript对象)。
TJ Crowder

Answers:


220

首先,您引用的代码不是JSON。您的代码是JavaScript对象文字表示法。JSON是为简化解析而设计的子集。

您的代码定义了一个对象(data),其中包含一个对象数组(items)(每个对象都带有一个idnametype)。

您不需要或不需要jQuery,而只需JavaScript。

添加项目:

data.items.push(
    {id: "7", name: "Douglas Adams", type: "comedy"}
);

这增加了最后。参见下面的中间添加。

删除项目:

有几种方法。该splice方法最通用:

data.items.splice(1, 3); // Removes three items starting with the 2nd,
                         // ("Witches of Eastwick", "X-Men", "Ordinary People")

splice 修改原始数组,并返回您删除的项目的数组。

在中间添加:

splice实际上既添加又删除。该splice方法的签名是:

removed_items = arrayObject.splice(index, num_to_remove[, add1[, add2[, ...]]]);
  • index -开始进行更改的索引
  • num_to_remove -从该索引开始,删除这么多条目
  • addN -...然后插入这些元素

所以我可以在第3个位置添加一个项目,如下所示:

data.items.splice(2, 0,
    {id: "7", name: "Douglas Adams", type: "comedy"}
);

这是说:从索引2开始,删除零个项目,然后插入以下项目。结果看起来像这样:

var data = {items: [
    {id: "1", name: "Snatch", type: "crime"},
    {id: "2", name: "Witches of Eastwick", type: "comedy"},
    {id: "7", name: "Douglas Adams", type: "comedy"},     // <== The new item
    {id: "3", name: "X-Men", type: "action"},
    {id: "4", name: "Ordinary People", type: "drama"},
    {id: "5", name: "Billy Elliot", type: "drama"},
    {id: "6", name: "Toy Story", type: "children"}
]};

您可以删除并立即添加一些:

data.items.splice(1, 3,
    {id: "7", name: "Douglas Adams", type: "comedy"},
    {id: "8", name: "Dick Francis", type: "mystery"}
);

...这意味着:从索引1开始,删除三个条目,然后添加这两个条目。结果是:

var data = {items: [
    {id: "1", name: "Snatch", type: "crime"},
    {id: "7", name: "Douglas Adams", type: "comedy"},
    {id: "8", name: "Dick Francis", type: "mystery"},
    {id: "4", name: "Ordinary People", type: "drama"},
    {id: "5", name: "Billy Elliot", type: "drama"},
    {id: "6", name: "Toy Story", type: "children"}
]};

嗨,如果我想确定对象数据中的项目数,以便在推送新项目时可以动态定义“ id”;我该怎么办?
哈德森·阿特维尔

@HudsonAtwell:data.items是一个数组。数组具有length属性。:-)
TJ Crowder 2013年

当执行推送时,我总是得到“ ...没有方法推送”。嗯...无法找出问题所在...
Sliq

@TJCrowder,是能够去除id = 5,也可以将更新nameid=6Toy
Mourya

如果JSON对象需要推送到json对象而不是数组,请使用$ .exetend,如Peter Drinnan在以下stackoverflow.com/a/17976034/2466650
Sai

19

接头很好,每个人都可以说明接头,所以我没有解释。您也可以在JavaScript中使用delete关键字,这很好。您也可以使用$ .grep使用jQuery来操纵它。

jQuery方式:

data.items = jQuery.grep(
                data.items, 
                function (item,index) { 
                  return item.id !=  "1"; 
                });

删除方式:

delete data.items[0]

对于添加PUSH来说,拼接效果更好,因为拼接具有很重的功能。拼接创建一个新的数组,如果数组很大,那么可能会很麻烦。删除有时很有用,在删除后,如果您要查找数组的长度,则那里的长度没有变化。因此,请明智地使用它。


您在最后一段要说什么?雾很大,我什么都不懂。
2015年

1
放下!对于它的不删除只是使未定义的相关索引

13

如果使用的是jQuery,则可以使用扩展功能来添加新项目。

var olddata = {"fruit":{"apples":10,"pears":21}};

var newdata = {};
newdata['vegetables'] = {"carrots": 2, "potatoes" : 5};

$.extend(true, olddata, newdata);

这将生成:

{"fruit":{"apples":10,"pears":21}, "vegetables":{"carrots":2,"potatoes":5}};

8

那根本不是JSON,而只是Javascript对象。JSON格式是数据的文本表示形式,它使用Javascript语法的子集。

您找不到有关使用jQuery操纵JSON的任何信息的原因是,因为jQuery没有能够做到这一点的东西,而且通常根本没有做到这一点。您以Javascript对象的形式处理数据,然后根据需要将其转换为JSON字符串。(不过,jQuery确实具有用于转换的方法。)

您拥有的只是一个包含数组的对象,因此您可以使用已经拥有的所有知识。只需使用data.items访问数组。

例如,使用动态值向数组添加另一个项目:

// The values to put in the item
var id = 7;
var name = "The usual suspects";
var type = "crime";
// Create the item using the values
var item = { id: id, name: name, type: type };
// Add the item to the array
data.items.push(item);

5

在json数组中添加对象

var arrList = [];
var arr = {};   
arr['worker_id'] = worker_id;
arr['worker_nm'] = worker_nm;
arrList.push(arr);

从json移除对象

它对我来说是工人。

  arrList = $.grep(arrList, function (e) { 

        if(e.worker_id == worker_id) {
            return false;
        } else {
            return true;
        }
    });

它返回一个没有该对象的数组。

希望能帮助到你。


3

好吧,这只是一个javascript对象,因此您可以data.items像处理普通数组一样进行操作。如果您这样做:

data.items.pop();

您的items阵列将缩短1个项目。


1

保持简单:)

var my_form_obj = {};
my_form_obj.name = "Captain America";
my_form_obj.weapon = "Shield";

希望这可以帮助!


0

尝试

data.items.pop();
data.items.push({id: "7", name: "Matrix", type: "adult"});

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.