假设我有一个这样的对象
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中还是非常基本的,我仍然不能忽略。但是我继续遇到这样的问题,无法找到这个问题的完整答案。
在此先感谢您能帮助我的人;)
答案 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
”解决方案是返回索引。它会给你带来一些好处
然后您可以通过返回的索引删除对象。
请签出我的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;
});
}