109

配列['0','1','1','2','3','3','3']を指定すると、結果は になります['0','1','2','3']

4

17 に答える 17

257

編集済み

ES6 ソリューション:

[...new Set(a)];

別:

Array.from(new Set(a));

古い応答。O(n^2) (大きな配列では使用しないでください!)

var arrayUnique = function(a) {
    return a.reduce(function(p, c) {
        if (p.indexOf(c) < 0) p.push(c);
        return p;
    }, []);
};
于 2013-07-27T22:19:04.143 に答える
52

秩序を維持したい場合:

arr = arr.reverse().filter(function (e, i, arr) {
    return arr.indexOf(e, i+1) === -1;
}).reverse();

組み込みの逆 indexof がないため、配列を逆にし、重複を除外してから、再度逆にします。

フィルター関数は、現在のインデックスより後 (元の配列の前) に出現する要素を探します。見つかった場合は、この要素を破棄します。

編集:

または、lastindexOf を使用することもできます (順序を気にしない場合)。

arr = arr.filter(function (e, i, arr) {
    return arr.lastIndexOf(e) === i;
});

これにより、一意の要素が保持されますが、最後の出現のみが保持されます。これは、['0', '1', '0'] が ['0', '1'] ではなく ['1', '0'] になることを意味します。

于 2012-11-21T04:50:51.233 に答える
26

以下は配列プロトタイプ関数です。

Array.prototype.unique = function() {
    var unique = [];
    for (var i = 0; i < this.length; i++) {
        if (unique.indexOf(this[i]) == -1) {
            unique.push(this[i]);
        }
    }
    return unique;
};
于 2013-04-04T08:48:40.413 に答える
9
function array_unique(arr) {
    var result = [];
    for (var i = 0; i < arr.length; i++) {
        if (result.indexOf(arr[i]) == -1) {
            result.push(arr[i]);
        }
    }
    return result;
}

組み込み関数ではありません。製品リストにアイテムが含まれていない場合は、それを一意のリストに追加し、一意のリストを返します。

于 2012-11-21T04:50:04.870 に答える
1
function array_unique(nav_array) {
    nav_array = nav_array.sort(function (a, b) { return a*1 - b*1; });      
    var ret = [nav_array[0]];       
    // Start loop at 1 as element 0 can never be a duplicate
    for (var i = 1; i < nav_array.length; i++) { 
        if (nav_array[i-1] !== nav_array[i]) {              
            ret.push(nav_array[i]);             
        }       
    }
    return ret;     
}
于 2012-11-21T04:44:39.390 に答える
1

配列から重複した値を削除する方法は次のとおりです。

function ArrNoDupe(dupArray) {
   var temp = {};
    for (var i = 0; i < dupArray.length; i++) {
         temp[dupArray[i]] = true;
         var uniqueArray = [];
       for (var k in temp)
           uniqueArray.push(k);
 return uniqueArray;
    }
}
于 2014-12-26T14:54:15.807 に答える
1

もう 1 つの方法は、配列情報の初期ストレージにオブジェクトを使用することです。次に、元に戻します。例えば:

var arr = ['0','1','1','2','3','3','3'];
var obj = {};

for(var i in arr) 
    obj[i] = true;

arr = [];
for(var i in obj) 
    arr.push(i);

変数 "arr" には ["0", "1", "2", "3", "4", "5", "6"] が含まれるようになりました

于 2015-02-24T21:54:19.503 に答える
1

私はこれを使うのが好きです。for ループを使用しても問題はありません。組み込み関数を使用するのが好きなだけです。型キャストまたは非型キャスト マッチングのブール引数を渡すこともできます。その場合、for ループを使用します (filter()メソッド/関数は型キャスト マッチング (===) を行います) 。

Array.prototype.unique =
function()
{
    return this.filter(
        function(val, i, arr)
        {
            return (i <= arr.indexOf(val));
        }
    );
}
于 2013-07-30T09:07:05.313 に答える
0

Google クロージャー ライブラリを使用しているgoog.array.removeDuplicates方は、unique と同じ を自由に使用できます。ただし、配列自体は変更されます。

于 2014-09-20T17:34:03.137 に答える
-2
    //
    Array.prototype.unique =
    ( function ( _where ) {
      return function () {
        for (
          var
          i1 = 0,
          dups;
          i1 < this.length;
          i1++
        ) {
          if ( ( dups = _where( this, this[i1] ) ).length > 1 ) {
            for (
              var
              i2 = dups.length;
              --i2;
              this.splice( dups[i2], 1 )
            );
          }
        }
        return this;
      }
    } )(
      function ( arr, elem ) {
        var locs  = [];
        var tmpi  = arr.indexOf( elem, 0 );
        while (
          ( tmpi ^ -1 )
          && (
            locs.push( tmpi ),
            tmpi = arr.indexOf( elem, tmpi + 1 ), 1
          )
        );
        return locs;
      }
    );
    //
于 2013-11-07T02:12:29.227 に答える
-4
Array.prototype.unique =function(){
    var uniqObj={};
    for(var i=0;i< this.length;i++){
      uniqObj[this[i]]=this[i]; 
    }
    return uniqObj;
}
于 2014-03-27T10:43:05.013 に答える