11

例として、次の文字列を取り上げます。

var string = "spanner, span, spaniel, span";

この文字列から重複する単語を見つけ、すべての重複を削除して単語の 1 つの出現箇所を保持し、改訂された文字列を出力したいと思います。

この例では次のようになります。

var string = "spanner, span, spaniel";

テスト用に jsFiddle をセットアップしました: http://jsfiddle.net/p2Gqc/

文字列内の単語の順序は一貫していないことに注意してください。また、各文字列の長さも一貫していないため、ここでは正規表現は機能しないと思います。文字列を配列に分割する方法に沿って何かを考えていますか? しかし、私はそれがクライアントにできるだけ軽く、超高速であることを望んでいます...

4

10 に答える 10

44

このようなものはどうですか?

文字列を分割し、配列を取得し、それをフィルタリングして重複する項目を削除し、結合して戻します。

var uniqueList=string.split(',').filter(function(item,i,allItems){
    return i==allItems.indexOf(item);
}).join(',');

$('#output').append(uniqueList);

フィドル

サポートされていないブラウザーの場合は、これを js に追加することで対処できます。

フィルターを見る

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp*/)
  {
    "use strict";

    if (this == null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun != "function")
      throw new TypeError();

    var res = [];
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in t)
      {
        var val = t[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, t))
          res.push(val);
      }
    }

    return res;
  };
}
于 2013-05-30T19:10:41.290 に答える
3

上記のいずれもうまくいかない場合は、別の方法があります。

var str = "spanner, span, spaniel, span";
str = str.replace(/[ ]/g,"").split(",");
var result = [];
for(var i =0; i < str.length ; i++){
    if(result.indexOf(str[i]) == -1) result.push(str[i]);
}
result=result.join(", ");

または、より良い形にしたい場合は、これを試してください:

Array.prototype.removeDuplicate = function(){
   var result = [];
   for(var i =0; i < this.length ; i++){
       if(result.indexOf(this[i]) == -1) result.push(this[i]);
   }
   return result;
}
var str = "spanner, span, spaniel, span";
str = str.replace(/[ ]/g,"").split(",").removeDuplicate().join(", ");
于 2013-05-30T19:29:22.513 に答える
1

filterPSL で使用される配列メソッドは ECMAScript 5 で追加され、古いブラウザーでは使用できませんが、他の両方の回答は正常に機能します。

長い文字列を処理している場合、$.inArray/を使用Array.indexOfすることは、以前にアイテムを見たことがあるかどうかを確認する最も効率的な方法ではありません (毎回配列全体をスキャンする必要があります)。代わりに、各単語をキーとしてオブジェクトに格納し、大きな配列を読み取るよりもはるかに高速なハッシュ ベースのルックアップを利用できます。

var tmp={};
var arrOut=[];
$.each(string.split(', '), function(_,word){
    if (!(word in tmp)){
        tmp[word]=1;
        arrOut.push(word);
    }
});
arrOut.join(', ');
于 2013-05-30T19:20:03.293 に答える
1
// Take the following string
var string = "spanner, span, spaniel, span";
var arr = string.split(", ");
var unique = [];
$.each(arr, function (index,word) {
    if ($.inArray(word, unique) === -1) 
        unique.push(word);

});

alert(unique);

ライブデモ

于 2013-05-30T19:12:21.670 に答える
1

以下は、文字列内の重複する単語を削除するための理解しやすく迅速なコードです。

var string = "spanner, span, spaniel, span";


var uniqueListIndex=string.split(',').filter(function(currentItem,i,allItems){
    return (i == allItems.indexOf(currentItem));
});

var uniqueList=uniqueListIndex.join(',');

alert(uniqueList);//Result:spanner, span, spaniel

これと同じくらい簡単に問題を解決できます。お役に立てれば。乾杯 :)

于 2014-08-17T10:32:30.560 に答える
1
<script type="text/javascript">
str=prompt("Enter String::","");
arr=new Array();
arr=str.split(",");
unique=new Array();
for(i=0;i<arr.length;i++)
{
    if((i==arr.indexOf(arr[i]))||(arr.indexOf(arr[i])==arr.lastIndexOf(arr[i])))
        unique.push(arr[i]);   
}
unique.join(",");
alert(unique);
</script>

このコード ブロックは、文から重複する単語を削除します。

if ステートメントの最初の条件、すなわち (i==arr.indexOf(arr[i])) には、繰り返し単語の最初の出現が結果に含まれます (このコードで一意の変数)。

2 番目の条件 (arr.indexOf(arr[i])==arr.lastIndexOf(arr[i])) には、繰り返されないすべての単語が含まれます。

于 2014-08-16T19:05:48.630 に答える
-1
var string = "spanner, span, spaniel, span";

var strArray= string.split(",");

var unique = [];
 for(var i =0; i< strArray.length; i++)
 {
   eval(unique[strArray] = new Object()); 
 }

// foreach を使用して、一意のものを簡単にトラバースできます。

私がこれを気に入っている理由は3 つあります。まず、IE8 またはその他のブラウザーで動作します。

2番。より最適化され、独自の結果が得られることが保証されています。

最後に、入力に空白があるその他の文字列配列で機能します

var string[] = {"New York", "New Jersey", "South Hampsire","New York"};

上記の場合、一意に格納される string[] には3 つの要素しかありません。

于 2014-04-03T09:39:29.543 に答える