删除函数返回的对象

时间:2018-12-12 15:23:25

标签: javascript jquery object

假设我有一个这样的对象

var $obj = {
    0 : {
        'id' : 3,
        'label' : 'Item One'
    },
    1 : {
        'id' : 7,
        'label' : 'Item Two'
    }
}

还有这样的功能:

function findById(obj, id){
    var result = false;
    $.each(obj, function(index, element){
        if(element.id === id)
        {
            result = element;
            return false;//stops $.each iteration
        }
    })
    return result;
}

现在,让我们假设我要以编程方式删除ID为“ 7”的项目,就像通过单击触发一样,无论如何,我都会这样触发函数:

delete findById($obj, 7);

在此“删除”之后,键1和id = 7的属性仍然存在。 我知道我丢失了一些东西,但是我无法摆脱这个xD。 如何将属性从原始对象中删除?我确定是关于范围的,或者在javascript中还是非常基本的,我仍然不能忽略。但是我继续遇到这样的问题,无法找到这个问题的完整答案。

在此先感谢您能帮助我的人;)

4 个答案:

答案 0 :(得分:0)

当您使用$.each迭代对象时,您所指的index实际上是对象密钥。

由于您的findById()未返回该密钥,因此您可能需要一个单独的删除方法

var $obj = {
    0 : {
        'id' : 3,
        'label' : 'Item One'
    },
    1 : {
        'id' : 7,
        'label' : 'Item Two'
    }
}

function deleteById(obj, id){    
    $.each(obj, function(key, element){
        if(element.id === id) {
           delete obj[key]
           return false;//stops $.each iteration
        }
    });   
}

deleteById($obj, 7)

console.log($obj)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

答案 1 :(得分:0)

如果我正确理解,您想从原始对象中删除与所选项目匹配的属性,对吗?

function findById(obj, id){
    var result = false;
    $.each(obj, function(index, element){
    
        // here the index is the name of the property on the original item. So "A", "B" etc.
        console.dir(index);
        if(element.id === id)
        {
            // you will need to know the name of the property you want to delete, not its value.
            result = index;
            return false;//stops $.each iteration
        }
    })
    return result;
}

var $obj = {
    "A" : {
        'id' : 3,
        'label' : 'Item One'
    },
    "B" : {
        'id' : 7,
        'label' : 'Item Two'
    }
}

// first you get the property name.
var propertyName = findById($obj, 7);
console.dir("Property to delete is: "+ propertyName);

console.dir("Original object before property deletion:");
console.dir($obj);
delete $obj[propertyName];
console.dir("Original object after property deletion:");
console.dir($obj);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

一些说明:
delete从JavaScript对象(reference)中删除属性。
您的原始对象具有两个属性,“ A”和“ B”。您要从对象中删除项目“ B”-在JavaScript中,这意味着从对象中删除属性。
因此,您需要做的是将对属性的引用传递给delete方法:这就是为什么我更改了findById函数以返回元素的“索引”(即名称)而不是其元素的原因。实际值。
最后一条指令delete $obj[propertyName];利用了JavaScript中的专有名称也可以用作对象索引器这一事实。因此,在这种特定情况下,该行可以视为等同于delete $obj.B

答案 2 :(得分:0)

我认为

最简单的“ one liner”解决方案是返回索引。它会给你带来一些好处

  1. 您无需创建新功能
  2. 您的旧功能不会失去其功能

然后您可以通过返回的索引删除对象。

请签出我的snippet,如果有什么可以帮助我改善答案的地方,请发表评论。

祝你有美好的一天。

var $obj = {
    0 : {
        'id' : 3,
        'label' : 'Item One'
    },
    1 : {
        'id' : 7,
        'label' : 'Item Two'
    }
}

function findById(obj, id){
    var result = false;
    $.each(obj, function(index, element){
        if(element.id === id)
        {
            result = element;
            
            //return the index
            result.index = index;
            
            return false;//stops $.each iteration
        }
    })
    return result;
}

//delete object by index
delete $obj[findById($obj, 7).index]


console.log($obj)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>

答案 3 :(得分:0)

如果您有对象数组而不是集合,则可以使用filter函数

var $obj = [
   {
      'id' : 3,
      'label' : 'Item One'
   },
   {
      'id' : 7,
      'label' : 'Item Two'
    }
];

function deleteElementByID($obj, id){
  return $obj.filter(function(item){
    return item.id != id;
  });
}

如果您不能或不希望将其转换为数组,则可以使用jQuery的map函数:

function deleteElementByID(id){
  $obj = $.map($obj,function(item,index){
    if(item.id != id) return item;
  });
}