如果第二个数组中没有的项,需要从第一个数组中删除。

3
我声明在写这篇文章之前已经尝试了很长时间。
对于一个InDesign脚本,我正在处理两个ListItem数组。现在我正在尝试删除第一个数组中不在第二个数组中的项目,但我卡住了。
鉴于我使用以下JavaScript代码(它运行得很好)来删除两个数组之间相等的项目:
function check_dupli(arr_A, arr_B) {
    for(var i = arr_B.length - 1; i >= 0; i--) {
        for(var j = 0; j < arr_A.length; j++) {
            if(arr_B[i] === arr_A[j]) {
                arr_B.splice(i, 1);
            }
        }
    }
    arr_B.sort();
}

arr_A = ["a","b","d","f","g"]
arr_B = ["a","c","f","h"]

check_dupli(arr_A, arr_B) --> arr_B = ["c","h"]
check_dupli(arr_B, arr_A) --> arr_B = ["b","d","g"]

我想修改它以忽略不在两个数组中的项,并获得我想要的内容,但由于我也得到了不需要的数据,所以出现了一些问题:

function get_dupli(arr_A, arr_B, arr_C) {
    for(var e = arr_B.length - 1; e >= 0; e--) {
        for(var k = 0; k < arr_A.length; k++) {
            if(arr_B[e] === arr_A[k]) {
                arr_C.push(arr_B[e]);
            }
        }
    }
    arr_C.sort();
}

arr_A = ["a","b","d","f","g"]
arr_B = ["a","g","k"]
arr_C = ["h"]

get_dupli(arr_A, arr_B, arr_C) --> arr_C = ["a","g","h","k"] instead of --> ["a","g","h"]
get_dupli(arr_B, arr_A, arr_C) --> arr_C = ["a","b","d","f","g","h"] instead of --> ["a","g","h"]

我错在哪里?有没有纯javascript的另一种解决方法呢?

提前感谢任何帮助。


如果你只是按照所述使用两个数组,那么为什么要首先引入第三个数组呢? - Amit Joki
1
你的代码似乎可以工作:jsfiddle - John S
5个回答

3
您可以使用Array.prototype.filterArray.prototype.concat来简化它:

arr_A = ["a","b","d","f","g"]
arr_B = ["a","g","k"]
arr_C = ["h"]

function getCommonItems(arrayA, arrayB, result) {
 result = result || [];
 result = result.concat(arrayA.filter(function(item) {
            return arrayB.indexOf(item) >= 0;    
          }));
 return result.sort();
}

alert(getCommonItems(arr_A, arr_B, arr_C).join(", "));
alert(getCommonItems(arr_B, arr_A, arr_C).join(", "));

对于第一个场景:

arr_A = ["a","b","d","f","g"]
arr_B = ["a","c","f","h"]

function getDifference(arrayA, arrayB, result) {
 return arrayB.filter(function(item) {
            return arrayA.indexOf(item) === -1;    
  }).sort();
}

alert(getDifference(arr_A, arr_B).join(", "));
alert(getDifference(arr_B, arr_A).join(", "));


Amit Joki我输入了第三个数组,以确保不改变前两个数组。可以将其视为临时数组。 - Alessio Tonarelli
John S,确切地说,在JSfiddle上可以正常工作,但在InDesign中尝试时却不行:结果还包括应该被忽略的内容。 - Alessio Tonarelli
OddDev,我已经按照你建议的方式对代码进行了测试,但结果与之前相同。 - Alessio Tonarelli
既然我的推理似乎是正确的,那么问题可能是由InDesign引起的吗?如果是这样,为什么我用来删除相等项的代码能够正常工作呢? - Alessio Tonarelli
@AlessioTonarelli 抱歉,老兄,我对InDesign并不是很了解。但是,你的代码没问题。肯定还有其他原因导致了这个问题。 - mohamedrias

1

Do it like this:

//the array which will loose some items
var ar1 = ["a", "b", "c"];
//the array which is the template
var ar2 = ["d", "a", "b"];

var tmpar = [];

for(var i = 0; i < ar1.length; i++){
  if(ar2.indexOf(ar1[i]) !== -1){
    tmpar.push(ar1[i]);
  }
}

ar1 = tmpar;

alert(ar1);

我们创建一个临时数组来存储有效值。
我们确保第一个数组中的值的索引不是“-1”。如果是“-1”,则索引未找到,因此该值无效!我们存储所有不是“-1”的东西(因此我们存储每个有效值)。

0

哎呀呀...我以为我已经回答完了并关闭了这个帖子...抱歉!!!

尽管我进行了所有的检查,但你的脚本失败是由于一个愚蠢的错误引起的...传递给函数的 arr_A 数组是原始数组的修改副本。

感谢大家的关心和帮助。再次道歉...


0

Array.prototype.contains =  function ( object )
{
 var i = 0, n = this.length;
 
 for ( i = 0 ; i < n ; i++ )
 {
  if ( this[i] === object )
  {
   return true;
  }
 }
 
 return false;
}

Array.prototype.removeItem = function(value, global) {
 var idx;
 var  n = this.length;
 while ( n-- ) {
  if ( value instanceof RegExp && value.test ( this[n]) 
  || this[n] === value ) {
   this.splice (n, 1 );
   if ( !global ) return this;
  }
 }
 return this;
};

arr_A = ["a","b","d","f","g"];
arr_B = ["a","c","f","h"];

var item
while ( item = arr_A.pop() ) {
 arr_B.contains ( item ) && arr_B.removeItem ( item  );
}

arr_B;


你的代码结果与我需要的相反: ["c", "h"] 而不是 ["a", "f"]。 - Alessio Tonarelli

0

arr_A = ["a","b","d","f","g"];
arr_B = ["a","c","f","h"];
var newArr = [];
var item
while ( item = arr_B.shift() ) {
 arr_A.contains ( item ) && newArr[ newArr.length ] = item ;
}
newArr;// ["a", "f"];


这个版本的脚本运行良好,但是与其他版本一样,当我将其插入到我的完整项目中时,它就不能正常工作了。下个周末我会仔细检查我的代码,我怀疑我漏掉了一些东西,阻止了你的建议的正确运行。 - Alessio Tonarelli
原型函数需要在任何调用之前放置。将函数放在代码开头,然后重试。 - Loic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接