从 javascript (jquery) 中的数组对象中删除值
Delete value from array object in javascript (jquery)
我正在尝试通过 javascript 从数组中删除对象。我正在构建一个简单的移动 jquery 应用程序并希望从数组中删除项目。我使用以下代码。我有一个带有复选框的列表。每个复选框都有一个属于列表项的值。因此,当检查多个复选框时。
function deleteFunction()
{
objects = getObjects();
$("input:checked").each(function()
{
var inputValue = $(this).val();
for(i = getObjects().length; i >=0; i--)
{
if('{"title":"'+ inputValue + '"}' == JSON.stringify(objects[i]))
{
objects.splice(i, 1);
return true;
}
}
});
alert(JSON.stringify(objects));
window.location.reload();
}
烦人的事情如下:
当我从数组中切片对象时,该对象将在第二次迭代中恢复。所以它总是只从数组中删除 1 个对象。
为了测试我的输出,我在 if 语句中使用了以下代码:
alert(i);
alert(JSON.stringify(objects[i]));
objects.splice(i, 1);
alert(i);
alert(JSON.stringify(objects));
return true;
输出结果如下
1
{"title":"hi2"}
1
[{"title":"hi1"}, {"title":"hi3"}]
2
{"title":"hi3"}
2
[{"title":"hi1"}, {"title":"hi2"}]
所以我切片 hi2,但已经返回
感谢回答和回应
解决方案 感谢 depperm + indubitablee:
function deleteFunction()
{
var objects = getObjects();
$("input:checked").each(function()
{
var inputValue = $(this).val();
for(i = objects.length -1; i >=0; i--)
{
if(objects[i].title == inputValue)
{
objects.splice(i, 1);
}
}
});
localStorage.setItem("objects", JSON.stringify(objects));
window.location.reload();
}
有几处我要更改,首先在 for
循环中无需每次都调用 getObjects()
,只需使用 objects
。然后在 if
中检查 objects[i].title
是否与 inputValue
相同。
function deleteFunction()
{
objects = getObjects();
$("input:checked").each(function()
{
var inputValue = $(this).val();
for(i = objects .length; i >=0; i--)
{
if(objects[i].title==inputValue)
{
objects.splice(i, 1);
}
}
});
alert(JSON.stringify(objects));
window.location.reload();
}
使用 .splice()
而不是 .slice()
。
slice
根本不是 alter/manipulate 原始数组,它只是根据您的选择创建另一个数组。
splice
确实改变了原始数组。
参考:http://www.devcurry.com/2010/12/slice-and-splice-in-javascript.html
数组方法slice
不删除数组元素。请改用 splice
。
您的代码存在一些问题:
- 您有时错过了关键字
var
。
- 变量
i
在第一次迭代中等于数组的长度。应该是一减那个。
- 而不是转换为 JSON 来比较 objects,您可以只比较标题的值 属性。
我正在尝试通过 javascript 从数组中删除对象。我正在构建一个简单的移动 jquery 应用程序并希望从数组中删除项目。我使用以下代码。我有一个带有复选框的列表。每个复选框都有一个属于列表项的值。因此,当检查多个复选框时。
function deleteFunction()
{
objects = getObjects();
$("input:checked").each(function()
{
var inputValue = $(this).val();
for(i = getObjects().length; i >=0; i--)
{
if('{"title":"'+ inputValue + '"}' == JSON.stringify(objects[i]))
{
objects.splice(i, 1);
return true;
}
}
});
alert(JSON.stringify(objects));
window.location.reload();
}
烦人的事情如下: 当我从数组中切片对象时,该对象将在第二次迭代中恢复。所以它总是只从数组中删除 1 个对象。
为了测试我的输出,我在 if 语句中使用了以下代码:
alert(i);
alert(JSON.stringify(objects[i]));
objects.splice(i, 1);
alert(i);
alert(JSON.stringify(objects));
return true;
输出结果如下
1
{"title":"hi2"}
1
[{"title":"hi1"}, {"title":"hi3"}]
2
{"title":"hi3"}
2
[{"title":"hi1"}, {"title":"hi2"}]
所以我切片 hi2,但已经返回
感谢回答和回应
解决方案 感谢 depperm + indubitablee:
function deleteFunction()
{
var objects = getObjects();
$("input:checked").each(function()
{
var inputValue = $(this).val();
for(i = objects.length -1; i >=0; i--)
{
if(objects[i].title == inputValue)
{
objects.splice(i, 1);
}
}
});
localStorage.setItem("objects", JSON.stringify(objects));
window.location.reload();
}
有几处我要更改,首先在 for
循环中无需每次都调用 getObjects()
,只需使用 objects
。然后在 if
中检查 objects[i].title
是否与 inputValue
相同。
function deleteFunction()
{
objects = getObjects();
$("input:checked").each(function()
{
var inputValue = $(this).val();
for(i = objects .length; i >=0; i--)
{
if(objects[i].title==inputValue)
{
objects.splice(i, 1);
}
}
});
alert(JSON.stringify(objects));
window.location.reload();
}
使用 .splice()
而不是 .slice()
。
slice
根本不是 alter/manipulate 原始数组,它只是根据您的选择创建另一个数组。
splice
确实改变了原始数组。
参考:http://www.devcurry.com/2010/12/slice-and-splice-in-javascript.html
数组方法slice
不删除数组元素。请改用 splice
。
您的代码存在一些问题:
- 您有时错过了关键字
var
。 - 变量
i
在第一次迭代中等于数组的长度。应该是一减那个。 - 而不是转换为 JSON 来比较 objects,您可以只比较标题的值 属性。