Javascript 从json数组中删除数据

Javascript 从json数组中删除数据,javascript,json,Javascript,Json,我试图从json数组中删除一段数据。例如,我有这个数组 var favorites = { "userID": "12345678", "favorites": [ { "name" : "My Favorites", "id" : "87654321", "items": [ {

我试图从json数组中删除一段数据。例如,我有这个数组

var favorites =    {
        "userID": "12345678",
        "favorites": [

            {   "name" : "My Favorites",
                "id" : "87654321",
                "items": 
                [
                    { 
                        "productID": "11234567",
                        "added": "TIMESTAMP",
                        "title": "Project",
                        "type": "Weekend Project",
                        "imageURL": "1"
                    },

                    { 
                        "productID": "11223456",
                        "added": "TIMESTAMP",
                        "title": "Bathroom",
                        "type": "Weekend Project",
                        "imageURL": "2"
                    },

                    { 
                        "productID": "11223345",
                        "added": "TIMESTAMP",
                        "title": "Curves",
                        "type": "Collections",
                        "imageURL": "3"
                    }
                ]
            },
            {   "name" : "Bathroom",
            "id" : "87654323",
            "items": 
            [
                { 
                    "productID": "11122224",
                    "added": "TIMESTAMP",
                    "title": "Project",
                    "type": "Weekend Project",
                    "imageURL": "1"
                },

                { 
                    "productID": "11122222",
                    "added": "TIMESTAMP",
                    "title": "Room",
                    "type": "Weekend Project",
                    "imageURL": "2"
                },

                { 
                    "productID": "11112222",
                    "added": "TIMESTAMP",
                    "title": "Strais",
                    "type": "Collections",
                    "imageURL": "3"
                },

                { 
                    "productID": "11111222",
                    "added": "TIMESTAMP",
                    "title": "Door",
                    "type": "Collections",
                    "imageURL": "4"
                }
            ]
        }
        ]
    } 
比如说,我想点击一个按钮,将a产品从浴室类别中删除。我该怎么做

我一直在尝试这一点,但毫无效果:

jQuery(document).on('click', ".removeFav", function() {
    favorites.favorites[1].items[1].splice();
}
我收到的错误信息:

未捕获的TypeError:对象#没有方法“splice”


要取消设置任何变量,请使用
delete
语句:

delete favorites.favorites[1].items[1]
这是正确的方法,它会起作用,但如果您的目标是按顺序保存索引,那么使用
splice
方法就是最好的选择:

favorites.favorites[1].items.splice(1,1);
上面将从第一个索引(第一个参数)开始删除一个元素(第二个参数)

因此要明确:要删除最后一个元素,请使用以下命令:

var arr = favorites.favorites[1].items;
arr.splice(arr.length - 1, 1);

如果阵列未设置或为空,您可以采取其他措施来保护代码:

var arr = favorites.favorites[1].items;
if ( arr && arr.length ) {
    arr.splice(arr.length - 1, 1);
}

如果要从数组中实际删除某个项,以便数组中该项之后的所有项向下移动到较低的索引,可以使用以下方法:

favorites.favorites[1].items.splice(1, 1);

您希望对实际的
数组进行操作,这意味着调用
数组上的方法。对于
.splice()
,您将传递要开始修改数组的索引,然后传递要删除的项数,因此
。splice(1,1)
将从索引1开始删除1项。

我很可能会为此构建一个原型方法,使命令更易于使用

// Place anywhere
Object.prototype.cut = function(start, elements){
    return this.items.splice(start, elements);
}

// Call using this
favorites.favorites[1].cut(1,1);
通过这种方式,您可以扩展方法并以非常灵活的方式处理数据

==编辑==

也许就像蓝天所指出的那样,它太灵活了。更新了下面的示例。我的风格是将favorites json添加到对象文本中,并在文本中包含所需的方法。此示例包括

  • JSON数据
  • 一种基于索引的元素裁剪方法
  • 一种基于索引获取收藏夹的方法
  • 基于参数名称值返回收藏夹的方法
片段

var favorites = {
    data: {
        "userID": "12345678",
        "favorites": [{
            "name": "My Favorites",
            "id": "87654321",
            "items": [{
                "productID": "11234567",
                "added": "TIMESTAMP",
                "title": "Project",
                "type": "Weekend Project",
                "imageURL": "1"
            }, {
                "productID": "11223456",
                "added": "TIMESTAMP",
                "title": "Bathroom",
                "type": "Weekend Project",
                "imageURL": "2"
            }, {
                "productID": "11223345",
                "added": "TIMESTAMP",
                "title": "Curves",
                "type": "Collections",
                "imageURL": "3"
            }]
        }, {
            "name": "Bathroom",
            "id": "87654323",
            "items": [{
                "productID": "11122224",
                "added": "TIMESTAMP",
                "title": "Project",
                "type": "Weekend Project",
                "imageURL": "1"
            }, {
                "productID": "11122222",
                "added": "TIMESTAMP",
                "title": "Room",
                "type": "Weekend Project",
                "imageURL": "2"
            }, {
                "productID": "11112222",
                "added": "TIMESTAMP",
                "title": "Strais",
                "type": "Collections",
                "imageURL": "3"
            },

            {
                "productID": "11111222",
                "added": "TIMESTAMP",
                "title": "Door",
                "type": "Collections",
                "imageURL": "4"
            }]
        }]
    },
    cut: function(favorite, start, elements) {
        return this.data.favorites[favorite].items.splice(start, elements);
    },
    get: function(favorite) {
        return this.data.favorites[favorite];
    },
    find: function(value, param) {
        var found;
        this.data.favorites.filter(function(item, i) {
            if (item[param] === value) {
                found = item;
                return;
            };
        })
        return found;
    }
};
要使用find,只需执行以下操作

favorites.find("Bathroom", "name")

这看起来很像object Literal,而不是json数组xdplice()是数组方法。使用…items[1].splice()时,您是在数组项上调用它,而不是在数组本身上调用它。请阅读FYI的更多内容,“JSON”是一种用于数据交换的文本格式。这里有一个javascript对象。问题是数组中还剩下索引0、2、3。我尝试过这个方法,它对我的情况有效,但它返回的数组中有一个空值,而不是删除的对象。有没有办法防止这种情况发生,使其只删除它而不留下任何内容?
delete
操作符的目的是从对象中删除属性,而不是从数组中删除项(有关详细信息,请参阅)。如果OP只想从数组中的该项中清除对象,他们可以将其设置为
null
。如果他们想从数组中完全删除该项,则
.splice()
是正确的工具。
delete
的目的是从内存中删除对象。在JS数组中碰巧也有对象。@jfriend00:设置为
null
和使用
delete
之间会有细微但重要的区别。也就是说,如果使用了
delete
,本机迭代器方法将跳过索引,但如果将其设置为
null
,则不会跳过索引。也就是说,
.splice()
可能是最终需要的。您是否将一个方法继承到每个对象,以便它对一个特定的对象类型进行操作?更不用说它现在需要在每个
for in
循环的每次迭代中使用
.hasOwnProperty()
。此外,该属性将在
.cut
属性的每次查找中出现,无论它是否是预期的属性。哎呀!然后将其放在与执行功能相同的上下文中。此外,hasOwn已经在ie6中实现了。问题是在
Object.prototype
上使用这种方法的所有后果。特别是对于仅用于那些具有指向数组的
.items
属性的对象的有限使用。所有这些仅仅是为了
.cut(1,1)
而不是
.items.splice(1,1)
不是一个好主意。我确实理解你的观点,但以这种心态,我们永远不会在原型上扩展。这是关于范围和范围的,如果范围正确,这是一个有用的方法。不是所有的原生原型都是一个问题<代码>对象。原型是一个例外情况。我的意思是,如果一个人决定去做,他可以去做,但我不认为应该给初学者一个例子。至少在没有对其后果进行全面描述的情况下是这样。@EHerman-然后你需要看看什么是
favorites.favorites[1]。items
实际上是什么。一种方法是执行
console.log(favorites.favorites[1].items)
,然后在调试控制台中查看它。你问题中的代码说应该是一个数组,它将有一个
.splice()
方法,但是你的实际代码可能与你问题中显示的不同。