【问题标题】:Remove JSON entry by value [duplicate]按值删除 JSON 条目 [重复]
【发布时间】:2013-01-18 14:07:26
【问题描述】:

可能重复:
Delete from array in javascript

我有以下 JSON 对象:

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

我将如何使用javascript删除值为“123”的项目?

或者如果我将 json 格式化为

[84, 92, 123, 2353]

在这种情况下如何删除?

【问题讨论】:

  • 第一个字符串不是有效的 JSON,甚至是 JavaScript。
  • 这非常令人困惑。您是否有实际的 json,例如包含 JavaScript 数组的序列化表示的字符串?或者你只有一个 JavaScript 数组?因为那个“JSON 字符串”是 not 有效的 JSON。
  • 这都是有效的,我只是用最简单的术语展示了结构......
  • 我上面放的只是json对象结构的一种表示..
  • @AndréFigueira 如果您第一次发布有效的 JSON,它将帮助所有人。您认为准确的表述可能对许多其他人来说并非如此。

标签: javascript jquery json


【解决方案1】:

假设你有这个:

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

【讨论】:

【解决方案2】:

假设您实际上在 json 变量中有一个来自 json 的对象

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

【讨论】:

  • 这应该被hasOwnProperty过滤。此外,密钥是唯一的,因此只能出现一次(=> 为什么循环?)。
  • 你是正确的hasOwnProperty,我解决了这个问题。循环是因为我们想从它的值中删除一个键,而不是键。
【解决方案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;
    }
}

【讨论】:

    【解决方案4】:
    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)
    

    【讨论】:

      【解决方案5】:

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

      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();
      

      【讨论】:

        【解决方案6】:

        似乎您想避免循环。假设它可用,您可以使用.filter

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

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

            【解决方案8】:

            假设我正确理解了您的问题和 cmets,您可以执行以下操作:

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

            【讨论】:

            • 没有循环就没有办法吗?宁愿避免这种情况。
            • 为什么?你必须在某个点循环(或递归)。
            • 好吧,因为它本质上是一个对象,因此通常具有删除键之类的功能......循环不是删除对象的一部分的非常优雅的解决方案。
            • 所以你想删除属性而不是对象?如果是这样,请查看 Magus 的答案。
            【解决方案9】:

            你目前拥有的不是 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}
            

            【讨论】:

              【解决方案10】:

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

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

              2) 有效的 JSON 需要成为有效的 JS

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

              3) 如果你有一个JS Array,你可以使用[].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 的符号
              • 是的,好的,但是在 JS 中,作为一种语言,有两种处理方式:作为 markup-lite 标记的序列化文本字符串表示,以及使用 JSON MIME 类型在支持的浏览器中。
              • 你在 JSON.stringify() 之后得到一个字符串,但不知道这一切是什么意思。
              • @Katcha 问题包含手写的无效 JSON;不是通过序列化 JS 对象生成的 JSON。这就是我的全部意思。
              猜你喜欢
              • 2014-12-28
              • 2023-04-06
              • 1970-01-01
              • 2021-01-22
              • 2018-03-05
              • 2018-10-16
              • 2010-12-17
              • 1970-01-01
              • 2014-08-01
              相关资源
              最近更新 更多