2016-07-15 4 views
1

は、私はこのような配列を持っているとしましょう配列要素の文字列が他の要素にある場合は、その要素を削除する必要があります。 'こんにちは、私の名前は'だから、こんにちは、私の 'は削除する必要があります。検索とフィルタリング配列

私はフィルターにしようとしている実際の配列は以下のとおりです。

var arr = ['11 22 13', '11 22 13 34', '11 22 13 34 15', '11 22 13 34 35', '11 22 23', '11 22 23 34', '11 22 23 34 15', '11 22 23 34 35', '31 22 13', '31 22 13 34', '31 22 13 34 15', '31 22 13 34 35', '31 22 23', '31 22 23 34', '31 22 23 34 15', '31 22 23 34 35']; 

私は別のグループにそれを破るしようとしたが、私はまだそれをどうするのか分かりません。私はとにかくそれを紹介します:

var threelink = []; 
var fourlink = []; 
var fivelink = []; 

    for(var i=0; i < arr.length; i++){ 
     if(arr[i].length>8&&arr[i].length<12){ 
      fourlink.push(arr[i]); 
     } 
     else if(arr[i].length>11){ 
      fivelink.push(arr[i]); 
     } 
     else { 
      threelink.push(arr[i]); 
     } 
    } 
+0

はソートされた配列の種類ですか? –

+0

はい、それは親や子供のようなものによってソートされます。 「こんにちは、私の」は祖父です、「こんにちは、私の名前は」父であり、ついに「こんにちは、私の名前はニュートンです」という子は –

答えて

1

昔ながらのネストされたループの解決策は、内側のループは、アレイの縮小部に見えるのでこれは副作用がなく(入力を歪ませない)、ヌル/未定義の値を許容します。

+0

入力を歪ませないという意味ですか? –

+0

James Jithinのソリューションは、入力配列をインプレースで再ソートします。これは、後で実行されるコードに悪影響を与える可能性があります。関数は引数を静かに変更するべきではありません。 – Tomalak

3

私はあなたがこれは配列をフィルタリングすると言う

arr.filter(function(e, i, a) { 
    return !a.some(function(e2) { 
    return e2 !== e && e2.includes(e); 
    }); 
}) 

をしたいと思い、それが含まれるNO(!some)他の要素が存在しないいる要素だけを保持する(ただし、それと等しくない)。

それはもう少しコンパクトES6の矢印の機能を持つです:

arr.filter((e, i, a) => !a.some(e2 => e2 !== e && e2.includes(e))); 

var arr = ['hello, my', 'hello, my name is', 'hello, my name is newton', 'hello, his', 'hello, his name is', 'hello, his name is pluto', 'hello, she is britney']; 
 

 
var filtered = arr.filter((e, i, a) => !a.some(e2 => e2 !== e && e2.includes(e))); 
 

 
console.log(filtered);

+0

あなたはそれをテストしましたか?それは私のために働かないのですか?私はまだそれを理解しようとしている –

0

あなたは、単にarray2には表示されませんarray1からすべての要素を削除したい場合は、あなたが使用することができますこのようなもの:

var array1 = ['hello, my', 'hello, my name is', 'hello, my name is newton', 'hello, his', 'hello, his name is', 'hello, his name is pluto', 'hello, she is britney']; 
var array2 = ['hello, my name is newton', 'hello, his name is pluto', 'hello, she is britney']; 

for(var i = 0; i < array.lengh; i++){ 
    if(array2.indexOf(array1[i]) == -1){ 
     array1.splice(i, 1); 
    } 
} 

あなたの問題を正しく理解して助けてくれることを祈っています。

+0

いいえ、私はこれが答えではないことを恐れています。私はどの要素が配列2にあるのかわからないので –

0

どうやってですか?

var arr = ['11 22 13', '11 22 13 34', '11 22 13 34 15', '11 22 13 34 35', '11 22 23', '11 22 23 34', '11 22 23 34 15', '11 22 23 34 35', '31 22 13', '31 22 13 34', '31 22 13 34 15', '31 22 13 34 35', '31 22 23', '31 22 23 34', '31 22 23 34 15', '31 22 23 34 35']; 

arr.sort(); 
var filterArray = new Array(); 
for(var i = 0 ; i < arr.length; i++) { 
    if(i + 1 == arr.length) { 
    filterArray.push(arr[i]); 
    } else { 
    if(arr[i+1].startsWith(arr[i])) { 
     continue; 
    } else { 
     filterArray.push(arr[i]); 
    } 
    } 
} 
alert(filterArray); 

JSFiddle

1

あなたは、文字列がオフフィルタに結果セット内にある場合と、実際の値は、結果セットに挿入するかどうかをチェックするために、Array#reduceArray#filterを使用することができます。

これはソートされていないデータに対しても機能します。それよりも

function uniqueContents(arr) { 
    var work = arr.slice(), result = [], 
     i, j, l = arr.length, found; 

    work.sort(function (a, b) { 
     return a.length > b.length; 
    }); 

    for (i = 0; i < l; i++) { 
     if (!work[i]) break; 
     found = false; 
     for (j = i + 1; j < l; j++) { 
      if (!work[j]) break; 
      found = work[j].indexOf(work[i]) > -1; 
      if (found) break; 
     } 
     if (!found) result.push(work[i]); 
    } 
    return result; 
} 

その他:このスレッドでは、おそらく速くalterativesより

var arr = ['hello, my', 'hello, my name is', 'hello, my name is newton', 'hello, his', 'hello, his name is', 'hello, his name is pluto', 'hello, she is britney', 'abc', 'ab'], 
 
    result = arr.reduce(function (r, a, i) { 
 
     var push = true; 
 
     r = r.filter(function (b) { 
 
      push = push && b.indexOf(a) === -1; 
 
      return a.indexOf(b) === -1; 
 
     }); 
 
     push && r.push(a); 
 
     return r; 
 
    }, []); 
 

 
console.log(result);