试图在javascript / JQuery中从数组中删除项目

时间:2017-02-11 23:37:18

标签: javascript jquery arrays

我已经在StackOverflow上阅读了几个关于此的问题,甚至找到了一些解决方案,但它们似乎都做了同样奇怪的事情:

我有一个包含8个名字的数组(数组A):

arrayA= ["person1", "person2", "person3", "person4", "person5", "person6", "person7", "person8"];

我有一个名字的数组(数组B):

arrayB= ["person1"];

现在,我想从阵列A中删除阵列B中的所有名称。

所以我写了一个小函数,它循环遍历数组A中的所有项,并检查它们是否出现在数组B中。如果没有,我将它们从数组A中删除。

所以我找了一个从数组中删除字符串的函数(在PHP中,这更容易......),我找到了几个方法,这些方法都给了我完全相同的问题。在下面的例子中,我选择了最干净的方法,使用jquery' $ .grep:



arrayA= ["person1", "person2", "person3", "person4", "person5", "person6", "person7", "person8"];
arrayB= ["person1"];

for (var i = 0, len = arrayA.length; i < len; i++) {
			
  if($.inArray(arrayA[i], arrayB) == -1){

    var removeName= arrayA[i];

    console.log('Removing row of: ' + removeName);

    /*
    $('tr[player=\'' + removeName + '\']').find('td')
    .wrapInner('<div style="display: block;" />')
    .parent()
    .find('td > div')
    .slideUp(700, function(){
      $(this).parent().parent().remove();
    });
    */

    arrayA= $.grep(arrayA, function(value) {
      return value != removeName;
    });
    
    console.log('arrayA now consists of: ' + arrayA);

  }

}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

正如您所看到的,它只会删除&#34;偶数&#34;来自arrayA的项目,即&#34; person2&#34;,&#34; person4&#34;,&#34; person6&#34;和&#34; person8&#34;。

如果我多次执行此功能,第二次只删除&#34;偶数&#34;项目(现在是&#34; person3&#34;&#34; person7&#34;),第三次,它删除了#person; person5&#34; (最终)...

有人可以告诉我,我没有看到什么吗? 您可以从控制台日志中看到,第一次运行它时,所有&#34; odd&#34;数组中的项目(即person3,person5和person7)是&#34; undefined&#34; ...

2 个答案:

答案 0 :(得分:2)

您可以使用do..while循环,Array.prototype.splice()从数组中删除元素

&#13;
&#13;
arrayA= ["vincent"
        , "Rumpelstilzchen"
        , "LuckeR"
        , "Nordland"
        , "Siegfried"
        , "NeKrone"
        , "Carnage"
        , "tom59fr"];
arrayB= ["vincent"];

var i = 0;

do {
  if (arrayB[0] !== arrayA[i]) {
    arrayA.splice(i, 1);  
  } else {
  ++i;
  }
} while (i < arrayA.length);
delete i;

console.log(arrayA, arrayB);
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这是因为当你这样称呼时:

arrayA= $.grep(arrayA, function(value) {
  return value != removeName;
});

arrayA的长度发生变化,因此arrayA[k]将移动到arrayA[k-1]的位置(当k> i时)。

因此,我们最好创建一个新数组来存储过滤后的项目,并在迭代后,将其值赋予arrayA。

&#13;
&#13;
arrayA= ["person1", "person2", "person3", "person4", "person5", "person6", "person7", "person8"];
arrayB= ["person1","person4"];
var arrayC=[];
for (var i = 0, len = arrayA.length; i < len; i++) {
  console.log('inArray:'+$.inArray(arrayA[i], arrayB))
  if($.inArray(arrayA[i], arrayB) != -1){
    arrayC.push(arrayA[i]);
  }
  console.log('arrayC now consists of: ' + arrayC);
}
arrayA=arrayC;
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;