2010-12-08 14 views
1

私は配列を持っていて、配列に格納されている要素で配列の要素を削除したいので、次のようなイラストが表示されます:なぜ配列の要素を削除できないのですか?

array1 =プロセス、集合、成熟刈り込み、刈り込み、刈り込み、刈り取り、刈り取り、刈り込み、刈り込み、刈り込み、刈り込み、刈り込み、刈り込み、刈り込み、これらの要素は削除されます。

私はこのような使用方法:

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

なぜ私はすぐに配列の要素を排除することはできませんか?

私はメソッドを使用していた

: 私は配列1にあるいくつかの要素を排除したい場合、配列は、による文字列への私の最初の変更である。しかし

var kataptg = array1.join (" "); 

、そのメソッドを使用している場合上記のようにパターンが配列kataを好まなかったため、失われるはずのいくつかの要素が失われる可能性があります。

""が ""の場合、配列のパターンは "="です。しかし、パターンのarray1 = "of";

書き込みパターンがアレイパターンと異なる場合でも、これらの要素はどのように削除できますか?

答えて

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

申し訳ありません。私は説明を理解していません。 – user495688

+0

@ user495688説明はありません。作業コードと出力があります。特定のコードに関する質問がある場合は、調査してください。 – Phrogz

+0

var a2なぜ私のコードで分割するのですか?var a2はすでに配列にあります – user495688

4

array1の項目には引用符が含まれていないため、JavaScriptでは変数が未定義であると判断します。

あなたはそれを修正したと仮定すると、次の問題は配列オブジェクトのreplace()を呼び出すことです。 replace()は文字列に対してのみ機能します。

+0

申し訳ありません。私は私の配列で引用符を与えることを忘れていますが、私は本当のコードは引用符を持っていると確信しています。 – user495688

+0

"作物と刈り取る前"の後に引用符がありません。 –

+0

ああ私の神は申し訳ありません私はそれを逃して..しかし、確かに私の配列はすでに文字列で変更されていますが、なぜ私は別の場所でいくつかの単語を置き換えることはできません? – user495688

0

することができます無視言葉、O(M + N)をドロップするソース配列を通過すべての「廃棄」をするnそれぞれの配列項目をテストしてそれらのどれかをテストします。

アレイの最後から開始すると、配列の先頭に向かって進むにつれて破棄されます。

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は=/^(is | of | a | from)$/i)

関連する問題