我想问一下,我有一个数组,我想用阵列中存储的元素消除数组中的一些元素,所以插图如下:
array1 =过程,收集,成熟,庄稼,来自,田地,收割,是,切割 array2 = of,from,the,is,a,an
如果array1中的元素也是array2的元素。然后这些元素将被淘汰。
我使用的方法如下:
var array1 = ["of","gathering","mature","crops","from","the","fields","Reaping","is","the","cutting"];
var kata = new Array();
kata[0] = " is ";
kata[1] = " the ";
kata[3] = " of ";
kata[4] = " a ";
kata[5] = " from ";
for(var i=0,regex; i<kata.length; i++){
var regex = new RegExp(kata[i],"gi");
array1 = array1.replace(regex," ");
}
为什么我不能立即消除数组的元素?
我一直在使用这个方法: 当我想要消除array1中的一些元素时,数组是我第一次通过以下方式更改为字符串:
var kataptg = array1.join (" ");
然而,如果使用该方法,有几个元素应该丢失但可能会丢失,因为模式不像上面的数组kata。
假设“”一词的, kata =“of”; 的模式,但在模式 array1 =“of”;
即使写入模式与数组kata中的写入模式不同,如何删除这些元素?
答案 0 :(得分:4)
array1中的项目没有引号,因此JavaScript认为它们是(未定义的)变量。
假设你已经修复了(以及杂散引号),你的下一个问题是你在数组对象上调用replace()。 replace()仅适用于字符串。
答案 1 :(得分:0)
# Simplified from
# http://phrogz.net/JS/Classes/ExtendingJavaScriptObjectsAndClasses.html#example5
Array.prototype.subtract=function(a2){
var a1=this;
for (var i=a1.length-1;i>=0;--i){
for (var j=0,len=a2.length;j<len;j++) if (a2[j]==a1[i]) {
a1.splice(i,1);
break;
}
}
return a1;
}
var a1 = "process of gathering mature crops from the fields".split(" ");
var a2 = "of from the is a an".split(" ");
a1.subtract(a2);
console.log(a1.join(' '));
// process gathering mature crops fields
如果性能是一个问题,那么显然有更好的方法不是O(m * n),例如将a2
中的单词推入对象进行恒定时间查找,这样它就是线性时间通过源数组来删除被忽略的单词O(m + n):
var a1 = "process of gathering mature crops from the fields".split(" ");
var a2 = "of from the is a an".split(" ");
var ignores = {};
for (var i=a2.length-1;i>=0;--i) ignores[a2[i]] = true;
for (var i=a1.length-1;i>=0;--i) if (ignores[a1[i]]) a1.splice(i,1);
console.log(a1.join(' '));
// process gathering mature crops fields
这是使用正则表达式(可能是O(m + n))的另一个解决方案:
var s1 = "process of gathering mature crops from the fields";
var a2 = "of from the is a an".split(" ");
var re = new RegExp( "\\b(?:"+a2.join("|")+")\\b\\s*", "gi" );
var s2 = s1.replace( re, '' );
console.log( re ); // /\b(?:of|from|the|is|a|an)\b/gi
console.log( s2 ); // "process gathering mature crops fields"
答案 2 :(得分:0)
您可以将所有'丢弃'放在一个reg exp中,并测试每个数组项中的任何一个。
通过从数组末尾开始,您可以在向阵列开始的过程中拼接掉任何丢弃。
var array1= ['of','gathering','mature','crops','from','the','fields',
'Reaping','is','the','cutting'],
kata= ['is','the','of','a','from'], L= array1.length,
rx= RegExp('^('+kata.join('|')+')$','i');
while(L){
if(rx.test(array1[--L])) array1.splice(L, 1);
}
alert(array1)
/ * 返回值:(数组) ['聚会','成熟','庄稼','田地','收获','切割'] * /
(这里的rx是= / ^(是| | | |来自)$ / i)