2013-01-18 57 views
2

可能重复:
Delete from array in javascript按值删除JSON入门

我有以下JSON对象:

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

我怎么会去有关删除的项目将值是“123”使用JavaScript?

,或者如果我格式化的JSON作为

[84, 92, 123, 2353] 

会是怎样在这种情况下被删除?

+7

第一个字符串不是有效的JSON,甚至不是有关此问题的JavaScript。 – Pointy

+1

这非常令人困惑。你是否有实际的* json *,像一个包含JavaScript数组的序列化表示的字符串?或者你只是有一个JavaScript数组?因为那个“JSON字符串”是*不是有效的JSON。 – meagar

+0

这一切都是有效的,我只是在最简单的条款中显示结构.... –

回答

5

假设你有这样的:

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 }] 
+0

http://stackoverflow.com/a/14400837/454533 - 快一点。 –

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]); 
} 
+0

有没有办法做到这一点没有循环?宁愿避免这种情况。 –

+0

为什么?你必须在某个时候循环(或递归)。 – Lloyd

+0

好,因为它基本上是一个对象,通常有一个功能,如删除键或其他东西...循环不是一个非常优雅的方法来删除一个对象的一部分。 –

5

假如你实际上是从一个JSON有一个对象在json可变

for (key in json) { 
    if (json.hasOwnProperty(key) && json[key] == 123) { 
     delete json[key]; 
    } 
} 
+0

这应该由'hasOwnProperty'过滤。另外,一个关键字是唯一的,所以只能出现一次(=>为什么是循环?)。 –

+0

你对'hasOwnProperty'正确,我解决了这个问题。循环是因为我们想从它的值中删除一个密钥,而不是密钥。 – Magus

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) 
2

较短的替代方案是:

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

可以使用拼接功能,像这样:

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

好像你wa nt以避免循环。假设它是可用的,你可以使用.filter

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

这在技术上没有做一个循环,但至少你不必看它。

0

假设你 “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/

-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; 
+0

JSON甚至不是一个字符串,它是一个像XML这样的符号 –

+0

是的,没关系,但在JS中,作为一种语言,有两种处理方式:作为markup-lite标记的序列化文本字符串表示,以及支持浏览器的JSON MIME类型。 – Norguard

+0

你在JSON.stringify()之后得到一个字符串,但不确定这是什么意思。 –

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}