10

私はここに配列を持っています:

var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];

ここで、重複の両方の外観を削除したいと思います。したがって、望ましい結果は次のようにはなりません

var myArr = [1, 2, 5, 7, 8 ,9];

しかし

var myArr = [2, 7, 8];

基本的に私は重複を削除する方法を知っていますが、その特別な方法ではありません。だからこそ、どんな助けも本当にありがたいです!

注意:私の配列は文字列でいっぱいです。ここでの数字は例としてのみ使用されています。

4

9 に答える 9

2

重複の削除が関係する場合はいつでも、set data structureを使用することは悪い考えではありません。

JavaScript にはネイティブの set 実装はありませんが、オブジェクトのキーも同様に機能します。この場合、値を使用して項目が配列に出現する頻度を追跡できるため、役立ちます。

function removeDuplicates(arr) {
    var counts = arr.reduce(function(counts, item) {
        counts[item] = (counts[item]||0)+1;
        return counts;
    }, {});
    return Object.keys(counts).reduce(function(arr, item) {
        if(counts[item] === 1) {
            arr.push(item);
        }
        return arr;
    }, []);
}

var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
removeDuplicates(myArr);

jsfiddle の例を確認してください

または、 への呼び出しを使用できずreduce()、代わりにforandfor(item in counts)ループを使用できます。

function removeDuplicates(arr) {
    var counts = {};
    for(var i=0; i<arr.length; i++) {
        var item = arr[i];
        counts[item] = (counts[item]||0)+1;
    }
    var arr = [];
    for(item in counts) {
        if(counts[item] === 1) {
            arr.push(item);
        }
    }
    return arr;
}

jsfiddle の例を確認してください

于 2012-07-13T16:34:07.540 に答える
1

より良い答えで編集:

var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];

function removeDuplicates(arr) {
    var i, tmp;
    for(i=0; i<arr.length; i++) {
        tmp = arr.lastIndexOf(arr[i]);
        if(tmp === i) {
            //Only one of this number
        } else {
            //More than one
            arr.splice(tmp, 1);
            arr.splice(i, 1);
        }
    }
}
于 2012-07-13T16:32:26.700 に答える
1

このコードのjsfiddle

var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
var newArr = myArr;
var h,i,j;


for(h = 0; h < myArr.length; h++) {
    var curItem = myArr[h];
    var foundCount = 0;
    // search array for item
    for(i = 0; i < myArr.length; i++) {
        if (myArr[i] == myArr[h])
            foundCount++;
    }
    if(foundCount > 1) {
        // remove repeated item from new array
        for(j = 0; j < newArr.length; j++) {
            if(newArr[j] == curItem) {                
                newArr.splice(j, 1);
                j--;
            }
        }            
    }
}
于 2012-07-13T16:34:02.053 に答える
1

ここに私のバージョンがあります

var a = [1, 1, 2, 5, 5, 7, 8, 9, 9];

function removeIfduplicate( arr ) {
    var discarded = [];
    var good      = [];
    var test;
    while( test = arr.pop() ) {
        if( arr.indexOf( test ) > -1 ) {
            discarded.push( test );
            continue;
        } else if( discarded.indexOf( test ) == -1 ) {
            good.push( test );
        }
    }
    return good.reverse();
}

x = removeIfduplicate( a );
console.log( x ); //[2, 7, 8]
于 2012-07-13T16:35:28.807 に答える
0

英数字のみで、重複は大文字と小文字が区別され、任意の要素が 2 つまでしかない場合は、次のようなものが機能します。

var a = [2, 1, "a", 3, 2, "A", "b", 5, 6, 6, "B", "a"],

    clean_array = $.map(a.sort(), function (v,i) {
        a[i] === a[i+1] && (a[i] = a[i+1] = null);
        return a[i];
    });

// clean_array = [1,3,5,"A","B","b"]
于 2012-07-13T16:43:29.930 に答える
-1

編集: jspref http://jsperf.com/deleting-both-values-from-arrayは次のとおりです。

http://jsfiddle.net/3u7FK/1/

これは、派手なトリックを使用せず、柔軟性を維持することなく、2 つのパスで行う最速の方法です。最初にスピンしてすべての出現回数を見つけ、それをキーと値のペアに入れます。次に、もう一度スピンして、カウントが 1 より大きいものを除外します。これには、「1 より大きい」以外のフィルターを適用できるという利点もあります。また、他の何かのためにそれが必要な場合は、発生回数を取得します。

これは、数値の代わりに文字列でも機能するはずです。

http://jsfiddle.net/mvBY4/1/

var myArr = [1, 1, 2, 5, 5, 7, 8, 9, 9];
var map = new Object();

for(var i = 0; i < myArr.length; i++)
{
    if(map[myArr[i]] === undefined)
    {
        map[myArr[i]] = 1;
    }
    else
    {
        map[myArr[i]]++;
    }
}

var result = new Array();

for(var i = 0; i < myArr.length; i++)
{   
    if(map[myArr[i]] > 1)
    {
        //do nothing
    }
    else
    {
        result.push(myArr[i]);
    }

}

alert(result);
于 2012-07-13T16:59:15.117 に答える
-1

以下のようにセット(IE 11+で利用可能)を使用できます

const sourceArray = [1, 2, 3, 4, 5, 5, 6, 6, 7, 7, 8];
const duplicatesRemoved = new Set();

sourceArray.forEach(element => {
    if (duplicatesRemoved.has(element)) {
        duplicatesRemoved.delete(element)
    } else {
        duplicatesRemoved.add(element)
    }
})

console.log(Array.from(duplicatesRemoved))

注意矢印機能は、古いブラウザではサポートされていません。代わりに、通常の関数構文を使用してください。ただし、古いブラウザでArray.fromは簡単にポリフィルできます。

ここで試してみてください

于 2019-01-25T14:20:46.587 に答える