根据值删除JSON条目

6

可能是重复问题:
如何在JavaScript中从数组中删除

我有以下JSON对象:

[id:84,id:92,id:123,id:2353]

如何使用JavaScript删除值为“123”的项?

或者,如果我将JSON格式化为

[84, 92, 123, 2353]

在这种情况下,它将如何被移除?

7
第一个字符串无法被解析为有效的JSON格式,甚至JavaScript也不行。 - Pointy
1
这非常令人困惑。你是否有实际的JSON,也就是包含JavaScript数组序列化表示的字符串?还是你只有一个JavaScript数组?因为那个“JSON字符串”不是有效的JSON。 - user229044
@AndréFigueira,这个结构的最简形式是[{id:1},{id:2}]。它很小、有效,并显示节点信息,只不过JSON是一个字符串。 - Norguard
我要打负分,因为不清楚你想做什么,是删除数组项还是从数组中的对象中删除键(导致多个冲突答案)。此外,提供的代码是错误/不完整的。 - Lloyd
@AndréFigueira,它甚至不是关联的,因为即使您误用了数组并将“id”属性设置了1000次,它仍然只有一个“id”的值:最后一个设置的值。如果它是对象的数组或集合,则描绘出来,因为这就是JS使用的方式。此外,您选择的解决方案在旧浏览器中无法工作,需要添加新数组内容的shim。在底层,filter只是使用循环并返回通过循环测试的所有项目的第二个数组。 - Norguard
显示剩余6条评论
10个回答

22

假设您有以下内容:

var items  = [{ id: 84 }, { id: 92 }, { id: 123 }, { id: 2353 }];

var filtered = items.filter(function(item) { 
   return item.id !== 123;  
});

//filtered => [{ id: 84 }, { id: 92 }, { id: 2353 }]

只是快了一点点。 - Explosion Pills

9
假设您实际上拥有一个来自json变量的JSON对象。
for (key in json) {
    if (json.hasOwnProperty(key) && json[key] == 123) {
        delete json[key];
    }
}

这应该通过 hasOwnProperty 进行过滤。此外,一个键是唯一的,因此只能有一个出现(=> 为什么要循环?)。 - Paul S.
你说的 hasOwnProperty 是对的,我会修复这个问题。而循环是因为我们想要从它的值中删除一个键,而不是键本身。 - Magus

3

更简短的替代方案是:

var newArr = [{id:84}, {id:92}, {id:123}, {id:2353}].filter(function(a) {
   return a.id != 123;
});

假设你有这个数组:

var arr = [{id:84}, {id:92}, {id:123}, {id:2353}]

如果你想要移除值为123的项,你可以进行以下操作:

for(var i = 0; i < arr.length; i++) {
    if(arr[i].id == 123) {
        arr.splice(i, 1);
        break;
    }
}

1
function removeClass(obj, cls) {
  var classes = obj.className.split(' ');

  for(i=0; i<classes.length; i++) {
    if (classes[i] == cls) {
      classes.splice(i, 1);
      i--; // (*)
    }
  }
  obj.className = classes.join(' ');

}

var obj = { className: 'open menu menu' }

removeClass(obj, 'menu')
alert(obj.className)

1
你可以使用splice函数,像这样:
var data = [{id:84}, {id:92}, {id:123}, {id:2353}];
            function remove(){
                for(var i = 0, max = data.length; i < max; i++) {
                    var a = data[i];

                    if(a.id === 123) {
                        data.splice(i, 1);
                        break;
                    }
                }
            }
            remove();

1

看起来你想避免一个循环。假设它可用,你可以使用.filter

[{id:84},{id:92},{id:123},{id:2353}]
   .filter(function (elem) { return elem.id !== 123; });

这个技术上确实会循环,但至少你不必看它。


1
假设你的“json”确实是一个数组,比如[84, 92, 123, 2353]:
var myString = "[84, 92, 123, 2353]";
var myArray = JSON.parse(myString);
var index = myArray.indexOf(123); // whatever value you are looking for
myArray.splice(index, 1);

http://jsfiddle.net/7vkK6/


0

假设我正确理解了您的问题和评论,您可以像这样做:

var old_array = [{id: 84},...];
var new_array = [];

for(var i = 0, len = old_array.length; i++) {
   if (old_array[i].id != 123) new_array.push(old_array[i]);
}

有没有不需要循环的方法? 最好避免使用循环。 - André Figueira
为什么?你必须在某个时候进行循环(或递归)。 - Lloyd
嗯,由于它本质上是一个对象,通常会有像删除键之类的功能...循环不是移除对象的一个部分的非常优雅的解决方案。 - André Figueira
所以你想删除属性而不是对象?如果是的话,请看Magus的答案。 - Lloyd

0

您目前手头的不是 JSON,因此我会给您提供一些其他选项。

如果您有一个 数组 arr = [84, 92, 123, 2353],那么

arr = arr.filter(function (x) {return x !== 123;}); // all occurrences
// OR
arr.splice(arr.indexOf(123), 1); // first occurrence only

如果你有一个 对象 obj = {"84": a, "92": b, "123": c, "2353": d},其中 ad 是一些表达式,那么
delete obj['123']; // obj now {"84": a, "92": b, "2353": d}

-2

1)JSON 是一个字符串,不是一个数组或一个对象。

var json = "[1,2,3]";

2) 有效的 JSON 必须是有效的 JS

var myJSObj = { 1,2,3 }, // broken
    myJSArr = [ name : 1, name2 : 2 ]; // broken

3) 如果你有一个JS数组,你可以使用[].splice来删除一个元素

var arr = [ 1, 2, 3, 4 ],
    i = 0, l = arr.length,
    test = 4;

for (; i < l; i += 1) {
    if (arr[i] === test) { arr.splice(i, 1); } // remove 1 starting at i
}

4) 如果您有一个带有命名键的对象,您可以使用delete

var obj = { val : 1 };
delete obj.val;

JSON甚至不是一个字符串,它像XML一样是一种标记语言。 - Explosion Pills
是的,没错,但在JS中,作为一种语言,有两种处理它的方式:一种是将其作为标记轻量级标记的序列化文本字符串表示,另一种是在支持的浏览器中使用JSON MIME类型。 - Norguard
你在使用 JSON.stringify() 后得到了一个字符串,但不确定这意味着什么。 - Nizar B.
@Katcha 这个问题包含手写的无效 JSON,而不是通过序列化 JS 对象生成的 JSON。这就是我所说的全部内容。 - Norguard

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