我在尝试做一些非常简单的事情时遇到了一个重大问题。我正在根据select元素的值将元素推送到数组中。
我正在推送元素,但是如果用户将select选项更改为“No”,我想从数组中删除特定元素。我谷歌远远地和广泛尝试了很多东西,阵列拼接方法似乎是要走的路。
我的问题是,根据文档,返回的数组是被删除的元素。我不想要这个,我想要保留在数组中的元素。
我实现的代码几乎可以工作但不完全。我可以添加到数组中,如果只有一个数组项我可以删除它。如果里面有多个项目,那么当我删除所需的元素时,它会返回数组中被删除的元素,因为我想返回数组中的其余元素。
到目前为止,这是我的代码
var pplArray = [];
$("#ddl_KnowlComp").change(function () {
if($('#ddl_KnowlComp').find("option:selected").text() == 'Yes' ){
$('#d_KnowlCompDate').attr('required', 'required');
pplArray.push( $("#ppl_KnowlSigned_TopSpan_HiddenInput"));
console.log(pplArray);
} else {
$('#d_KnowlCompDate').removeAttr('required');
$('#d_KnowlCompDate').val('');
var itemtoRemove = $("#ppl_KnowlSigned_TopSpan_HiddenInput");
removeArrayItem(itemtoRemove,pplArray);
}
});
$("#ddl_IniComEngComp").change(function () {
if($('#ddl_IniComEngComp').find("option:selected").text() == 'Yes' ){
$('#d_IniComEngCompDate').attr('required', 'required');
pplArray.push ($("#ppl_IniComEngCompSigned_TopSpan_HiddenInput"));
console.log(pplArray);
} else {
$('#d_IniComEngCompDate').removeAttr('required');
$('#d_IniComEngCompDate').val('');
var itemtoRemove = $("#ppl_IniComEngCompSigned_TopSpan_HiddenInput");
removeArrayItem(itemtoRemove,pplArray);
}
});
function removeArrayItem(itemtoRemove, arr){
arr.splice($.inArray(itemtoRemove, arr),1);
console.log(pplArray);
}
如果有人可以指出我的问题会很棒:-)
$ .grep()方法根据需要从数组中删除项目,以便所有剩余项目都通过提供的测试。测试是一个传递数组项的函数和数组中项的索引。仅当测试返回true时,该项才会位于结果数组中。
filter函数将传递两个参数:当前数组项及其索引。 filter函数必须返回'true'才能在结果数组中包含该项。
你应该能够拥有新阵列!但我建议使用splice(index, 1)
,获取元素的索引,然后将其删除,你应该得到一个没有它的新数组!
如果你想看到删除的项目:
1-可以创建变量。 2-根据(索引.3删除它)将项目保存到删除之前.4使用您创建的变量来显示它!
:)
你有2个问题:
splice(-1, 1)
将取代array
的最后一个元素splice
修改了原始的array
一些澄清:
let arr = [1, 2, 3];
const iFound = 2;
const iNotFound = 4;
const p1 = arr.indexOf(iFound);
console.log(`${iFound} found at ${p1}`);
const p2 = arr.indexOf(iNotFound);
console.log(`${iNotFound} found at ${p2}`);
arr.splice(p1, 1, 'x');
console.log(arr);
// your problem is here
// for the case where the element is not found
// it will be replaced the last element
// in the collection
arr.splice(p2, 1, 'x');
console.log(arr);
您的代码的修复程序将是:
function removeArrayItem(itemtoRemove, arr){
let pos = $.inArray(itemtoRemove, arr);
//Note: splice modifies the original array
pos >-1 && arr.splice(pos,1);
console.log(arr);
}
由于.splice()
从原始数组中删除了一个项,因此您可以简单地忽略.splice()
的返回值并使用原始数组。
例如,你有这个:
newArray = arr.splice($.inArray(itemtoRemove, arr),1);
console.log(newArray);
相反,它将是这样的:
arr.splice( $.inArray(itemtoRemove,arr), 1 );
console.log(arr);
(我没有检查你的其余任何逻辑,包括$.inArray()
调用,只是建议如何删除元素的数组 - 它只是原始 - 现在修改过的数组。)