jQuery - 使用splice删除数组中的项目,但返回包含其余项目的数组,而不是删除项目

问题描述 投票:0回答:4

我在尝试做一些非常简单的事情时遇到了一个重大问题。我正在根据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);
    }

如果有人可以指出我的问题会很棒:-)

javascript jquery arrays splice
4个回答
0
投票

$ .grep()方法根据需要从数组中删除项目,以便所有剩余项目都通过提供的测试。测试是一个传递数组项的函数和数组中项的索引。仅当测试返回true时,该项才会位于结果数组中。

filter函数将传递两个参数:当前数组项及其索引。 filter函数必须返回'true'才能在结果数组中包含该项。

参考:http://api.jquery.com/jquery.grep/


0
投票

你应该能够拥有新阵列!但我建议使用splice(index, 1),获取元素的索引,然后将其删除,你应该得到一个没有它的新数组!

如果你想看到删除的项目:

1-可以创建变量。 2-根据(索引.3删除它)将项目保存到删除之前.4使用您创建的变量来显示它!

:)


0
投票

你有2个问题:

  1. splice(-1, 1)将取代array的最后一个元素
  2. 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);
  }

0
投票

由于.splice()从原始数组中删除了一个项,因此您可以简单地忽略.splice()的返回值并使用原始数组。

例如,你有这个:

  newArray = arr.splice($.inArray(itemtoRemove, arr),1);
  console.log(newArray);

相反,它将是这样的:

  arr.splice( $.inArray(itemtoRemove,arr), 1 );
  console.log(arr);

(我没有检查你的其余任何逻辑,包括$.inArray()调用,只是建议如何删除元素的数组 - 它只是原始 - 现在修改过的数组。)

© www.soinside.com 2019 - 2024. All rights reserved.