2010-12-08 5 views
1

나는 배열을 가지고 있는데 배열에 저장 한 요소로 배열의 일부 요소를 제거하려고합니다. 따라서 그림은 다음과 같습니다 :배열 요소를 제거 할 수없는 이유는 무엇입니까?

array1 = 프로세스, 중, 수집 중 , crop, from, the, fields, Reaping, is, 절단, 배열 1에 요소가있는 경우 array2 = of, from, the, is, a

또한 array2의 요소입니다. 이 요소들은 제거 될 것입니다.

I는 다음과 같이 사용하는 방법은 :

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

왜 나는 즉시 배열의 요소를 제거 할 수 있습니까?

내가 방법을 사용하고 있었다 : 그 방법을 사용하는 경우,

var kataptg = array1.join (" "); 

그러나 : 내가하는 array1에있는 일부 요소를 제거하고자 할 때 그 배열에 의해 문자열로 내 첫 번째 변화는 입니다 패턴은 위와 같이 배열 kata를 좋아하지 않았기 때문에 손실되어야하지만 손실 될 수있는 몇 가지 요소가 있습니다.

""이 ""이고, 배열 패턴이 kata = "of"인 것으로 가정하십시오.하지만 패턴에 array1 = "of";

필기 패턴이 배열 kata의 필기 패턴과 다른 경우에도 어떻게 이러한 요소를 제거 할 수 있습니까?

답변

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 

예는 선형 시간이되도록 일정 시간의 검색을위한 목적으로 a2에서 단어를 미는 등 (분 * 않음) O 아니다 분명히 나은 방법이있다 성능이 문제가되는 경우

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" 
+0

죄송합니다 .. 설명해 주셔서 이해가 안됩니다 .. – user495688

+0

@ user495688 설명이 없으며 작동 코드와 출력물이 있습니다. 특정 코드에 대해 질문이 있으면 조사하거나 여기에서 질문하십시오. – Phrogz

+0

var a2 내 코드에서 왜 나눕니까? var a2가 이미 배열에 있습니다. – user495688

4

array1의 항목에는 따옴표가 없으므로 JavaScript는 변수가 정의되지 않은 변수라고 생각합니다.

당신이 그것을 고쳐 놓았다고 가정하면 다음 문제는 배열 객체에서 replace()를 호출한다는 것입니다. replace()는 문자열에서만 작동합니다.

+0

죄송합니다.내 배열에 따옴표를 제공하는 것을 잊지 만, 나는 split() 배열로 대체하는 var str에서 가져 오기 때문에 내 실제 코드에 따옴표가 있다고 확신합니다. – user495688

+0

"작물과 수확 전"후에 따옴표가 누락되었습니다. –

+0

오 세상에 미안하지만 나는 그것을 놓치고있다. 그러나 확실히 배열은 이미 문자열로 바뀌었지만 왜 다른 단어로 바꿀 수없는거야? – user495688

0

할 수 무시 된 단어, O (m + N)를 드롭 소스 배열 관통 모든 버려진 물건들을 버려라. n 하나의 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는 =/^ (| | a |부터) $/i)

관련 문제