【问题标题】:Deleting a row from javascript object从 javascript 对象中删除一行
【发布时间】:2012-11-29 20:05:32
【问题描述】:

我有一个看起来像这样的 javascript 对象:-

var myObject = [{"id": "1", "URL": "http://shsudhf.com", "value": "1"}, 

                {"id": "2", "URL": "http://shsusadhf.com", "value": "2"},

                {"id": "3", "URL": "http://shsudsdff.com", "value": "0"}];

现在,我必须删除对象中 ID 值为 2 的所有行。这是怎么做到的?

【问题讨论】:

  • 您可以在没有删除部分的情况下重新创建数组
  • 必须是变异操作吗?
  • 你有什么方便的?原型.js? jQuery?
  • 我使用的是纯 JavaScript。我猜如果行数非常大,重新创建会有点慢。是的,它会相互使用
  • 删除id为“2”的项目后是否需要原始数组?

标签: javascript javascript-objects delete-row


【解决方案1】:

如果“删除”行后不需要原始数组,可以像这样使用splice

http://jsfiddle.net/rmcu5/1/

var myArray = [{"id": "1", "URL": "http://shsudhf.com", "value": "1"},
                {"id": "2", "URL": "http://shsusadhf.com", "value": "2"},
                {"id": "3", "URL": "http://shsudsdff.com", "value": "0"}];

function removeItemsById(arr, id) {
    var i = arr.length;
    if (i) {   // (not 0)
        while (--i) {
            var cur = arr[i];
            if (cur.id == id) {
                arr.splice(i, 1);
            }
        }
    }
}

removeItemsById(myArray, "2");

console.log(JSON.stringify(myArray));

它不会创建新数组,只是在原处修改原始数组。如果您需要原始数组及其所有项目,请使用其他解决方案之一,该解决方案会返回原始数组的修改副本。

【讨论】:

  • +1 表示拼接,因为这是从数组中删除项目的“原生”方式。
  • 你能解释一下 arr.splice 吗?
  • @PrashantSingh 它需要 3 个参数(只有我们担心的前 2 个)。第一个参数是开始删除项目的索引,第二个参数是要删除的项目数。我只是将它设置为1,因为我们只想删除循环中的单个项目(它的id2
  • @PrashantSingh 循环从数组的末尾开始并循环到开头,这对于这样的事情很重要,因为您在循环时直接修改数组并且可以摆脱循环
  • @PrashantSingh 没问题。请记住,这会修改原始数组。如果您想将原始数组保持在其状态,但还要获得一个已删除特定项目的副本,您将需要使用其他人的解决方案。这真的取决于你具体需要做什么
【解决方案2】:

请注意,您所说的 myObject 实际上是一个数组,因此您可以在其上使用数组方法:

myObject = myObject.filter(function( obj ) {
  return obj.id != 2;
});

演示: http://jsfiddle.net/elclanrs/LXpYj/

【讨论】:

  • 这非常好,但 OP 确实要求使用 mutator。我不同意 OP 对 mutator 的要求。您的解决方案显然是最好的,因为从数组中间移除很糟糕。如果 OP 同意这没问题,我会 +1。
  • @PrashantSingh 请注意,这在 IE filter 方法在它们上工作
  • @Ian 好的,这意味着我不能使用这个:O
  • 是的,但您需要为旧版浏览器添加 polyfill。如果不存在,polyfill 只是一些添加该功能的代码。这里有一个 140 字节的 filter polyfill:gist.github.com/1031656。即使使用 polyfill,代码也将比大多数其他方法更短且更具可读性。
【解决方案3】:

试试这个:

function deleteObject(array,id)
{
 var newObject=[]; 
  for (var o in array) {
       if(array[o].id!=id)
          newObject.push(array[o]);
    }
return newObject;
}

工作JS fiddle

你可以不创建新数组,你需要编写删除函数:

Array.prototype.remove = function() {
    var what, a = arguments, L = a.length, ax;
    while (L && this.length) {
        what = a[--L];
        while ((ax = this.indexOf(what)) !== -1) {
            this.splice(ax, 1);
        }
    }
    return this;
};

Without New Array Delete Object

【讨论】:

  • 重新创建数组是唯一的解决方案吗?
【解决方案4】:

用过滤器试试(它是一个数组而不是一个对象)

var rr = [{"id": "1", "URL": "http://shsudhf.com", "value": "1"},  {"id": "2", "URL": "http://shsusadhf.com", "value": "2"}, {"id": "3", "URL": "http://shsudsdff.com", "value": "0"}];


rr = rr.filter(function(e) {
    return e.id != 2;
});

【讨论】:

    【解决方案5】:

    给你,这不需要重新创建数组或任何东西。

     var myObject = [{"id": "1", "URL": "http://shsudhf.com", "value": "1"}, 
    
                    {"id": "2", "URL": "http://shsusadhf.com", "value": "2"},
    
        {"id": "3", "URL": "http://shsudsdff.com", "value": "0"}];
    
    for(i=0,iMax=myObject.length;i<iMax;i++){
        (function (a) { 
            if(this.id=="2"){
              delete myObject[a];
            }
        }).call(myObject[i],i);
    }
    
    console.log(myObject);
    ​
    ​
    

    jsFiddle

    http://jsfiddle.net/gG2zz/1/

    【讨论】:

    • 你确实意识到THIS 会做同样的事情,但它仍然不会删除任何东西,它只是将数组项设置为未定义?
    • @adeneo 好吧,如果来晚了,我很抱歉,我很累。但是为什么说不删呢link
    • delete 在对象上工作正常,就像在链接的问题中一样,但在数组上,索引没有更新,长度仍然相同,所以它不是真正的“删除”,这是主要问题对于数组,删除东西是一件很痛苦的事情,而且通常需要一些切片和切块。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2017-06-19
    • 2021-10-15
    • 1970-01-01
    • 2016-05-19
    • 2010-09-17
    相关资源
    最近更新 更多