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

时间:2017-12-20 08:59:22

标签: javascript jquery arrays splice

我在尝试做一些非常简单的事情时遇到了重大问题。 我根据select元素的值将元素推送到数组中。

我推送元素很好,但是如果用户将选择选项更改为“否”'我想从数组中删除一个特定的元素。我谷歌远远地和广泛尝试了很多东西,阵列拼接方法似乎是要走的路。

我的问题是,根据文档,返回的数组是被删除的元素。我不想要这个,我想要保留在数组中的元素。

我实施的代码几乎可以工作但不完全。我可以添加到数组中,如果只有一个数组项我可以删除它。如果里面有多个项目,那么当我删除所需的元素时,它会返回数组中被删除的元素,其中我想返回数组中的其余元素。

到目前为止,这是我的代码

    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);
    }

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

4 个答案:

答案 0 :(得分:0)

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

如果您想查看已删除的项目:

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

:)

答案 1 :(得分:0)

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

例如,你有这个:

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

相反,它会是这样的:

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

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

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

您有两个问题:

  1. splice(-1, 1)将替换array
  2. 的最后一个元素
  3. splice修改原始array
  4. 一些澄清:

    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);
      }