使用jQuery通过值删除JSON数组中的元素

6
我的 JSON 数组的一部分
var videos = $j.parseJSON('
  [
    { "privacy":"public",
      "id":"1169341693" },

    { "privacy":"private",
      "id":"803641223" },

    { "privacy":"public",
      "id":"1300612600" }, ......

当我使用console.log输出元素时,我得到的结果是:
   [Object, Object, Object, ]
       0: Object
           privacy: "public"
           id: "1169341693"
       1: Object
           privacy: "private"
           id: "803641223"
       2: Object
           privacy: "public"
           id: "1300612600"

我也有一个想要搜索的唯一标识符
var uniqueId = 803641223;

我希望能够在我的视频数组中找到正确的id,并删除整个数组元素。因此,在这种情况下,我希望我的最终视频数组只包含2个对象,而不是3个:

 var videos = $j.parseJSON('
  [
    { "privacy":"public",
      "id":"1169341693" },

    { "privacy":"public",
      "id":"1300612600" }, ......

我的问题是如何进入数组来执行splice操作。我希望使用jQuery完成。

请帮忙吗?

4个回答

14
你可以使用grep
videos = $.grep(videos, function(e) { return e.id!='803641223' });

在原生JavaScript中,你可以使用类似的filter函数,但它不被IE8支持。

请注意,videos是一个JavaScript数组,而不是JSON数组,即使它是通过解析JSON字符串创建的。


请注意,这将创建一个新数组,其中包含可接受的元素(不具有特定的“id”属性)。splice会直接修改原数组。这取决于你想要哪个。 - Ian
哦,在这种特殊情况下,我需要一个splice来修改原始数组。我可以使用您的解决方案和splice吗? - Lelly
@Lelly,dystroy的解决方案重新分配videos的值,将其赋给“filtered”列表。从技术上讲,它实现了与splice相同的功能,只是多做了一些额外的工作。如果您想保留videos中的原始数组,但在新变量中拥有过滤后的数组,则可以使用以下代码:var videos = [ blah blah blah ]; var filteredVideos = $.grep(videos, function(e) { return e.id!='803641223' }); - 请注意,videos仍将包含原始数组,而filteredVideos将包含基于uniqueId的过滤数组。因此,您将从那里使用filteredArray - Ian
@Lelly 如果你想改变原始数组,可以使用Ian的解决方案,这没问题。但是请注意:大多数情况下,你真正想要的是一个新的数组。- dystroy 2分钟前编辑 - Denys Séguret
如果您同意/愿意,您可以包括/解释一下您的示例是如何使用过滤后的数组覆盖videos,从技术上讲,这与剪切相同。如果您将$.grep的结果存储在另一个变量中,则仍将具有原始的videos数组和新的过滤数组。因此,我评论中的示例使用了var videos = [ blah blah blah ]; var filteredVideos = $.grep(videos, function(e) { return e.id!='803641223' }); - 这应该满足保留原始内容。 - Ian
@Ian 我不确定对于Lelly来说还有什么不清楚的地方,尤其是在你的评论之后。 - Denys Séguret

4

一种不使用jQuery的解决方案,可以直接在数组中进行修改:

var uniqueId = 803641223;
var videos = [
    { "privacy":"public",
      "id":"1169341693" },

    { "privacy":"private",
      "id":"803641223" },

    { "privacy":"public",
      "id":"1300612600" }
];

function cleaner(arr, id) {
    for (var i = 0; i < videos.length; i++) {
        var cur = videos[i];
        if (cur.id == uniqueId) {
            arr.splice(i, 1);
            break;
        }
    }
}

cleaner(videos, uniqueId);

http://jsfiddle.net/4JAww/1/

请注意,此操作会直接修改原始数组,因此原始的videos数组将包含您想要的项目,而匹配的uniqueId将被删除(永远)。因此,这取决于您是否希望能够再次访问原始数组,或者对修改它感到满意。
它只是循环遍历数组的元素,比较项目的id属性与uniqueId值,并在它们匹配时进行splice。我在splice之后立即使用break;,因为您似乎暗示uniqueId只能/应该在数组中出现一次,因为它是唯一的。

3

你好,你可以使用JavaScript的splice函数来删除元素...

videos.items.splice(1, 3); // Removes three items starting with the 2nd,

0

它对我有效。

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

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

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

希望能有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接