1. ホーム
  2. ジャバスクリプト

[解決済み】JavaScriptで2つの配列を結合し、項目の重複を排除する方法

2022-03-18 23:04:26

質問

JavaScriptの配列が2つあります。

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];

を出力してほしい。

var array3 = ["Vijendra","Singh","Shakya"];

出力配列は、繰り返される単語を削除する必要があります。

JavaScript で 2 つの配列をマージして、それぞれの配列からユニークな項目だけを元の配列に挿入した順序で取得するにはどうすればよいのでしょうか?

どのように解決するのですか?

配列をマージするだけ(重複を排除しない)場合

ES5版では Array.concat :

var array1 = ["Vijendra", "Singh"];
var array2 = ["Singh", "Shakya"];

console.log(array1.concat(array2));

ES6版使用 構造改革

const array1 = ["Vijendra","Singh"];
const array2 = ["Singh", "Shakya"];
const array3 = [...array1, ...array2];

重複を削除する「ビルトイン」方法はないため ( ECMA-262 実際には Array.forEach というのは、これは素晴らしいことです)、私たちは手動でそれを行う必要があります。

Array.prototype.unique = function() {
    var a = this.concat();
    for(var i=0; i<a.length; ++i) {
        for(var j=i+1; j<a.length; ++j) {
            if(a[i] === a[j])
                a.splice(j--, 1);
        }
    }

    return a;
};

次に、使用方法です。

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
// Merges both arrays and gets unique items
var array3 = array1.concat(array2).unique(); 

これにより、配列の順序も保持されます(つまり、ソートは必要ありません)。

のプロトタイプ増強に悩む人は多いので、この機会にぜひ。 Array.prototypefor in ループを使用する場合、より侵襲的でない方法を紹介します。

function arrayUnique(array) {
    var a = array.concat();
    for(var i=0; i<a.length; ++i) {
        for(var j=i+1; j<a.length; ++j) {
            if(a[i] === a[j])
                a.splice(j--, 1);
        }
    }

    return a;
}

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
    // Merges both arrays and gets unique items
var array3 = arrayUnique(array1.concat(array2));

幸運にもES5が利用可能なブラウザを使用している人は、ES5を使用するために Object.defineProperty このように

Object.defineProperty(Array.prototype, 'unique', {
    enumerable: false,
    configurable: false,
    writable: false,
    value: function() {
        var a = this.concat();
        for(var i=0; i<a.length; ++i) {
            for(var j=i+1; j<a.length; ++j) {
                if(a[i] === a[j])
                    a.splice(j--, 1);
            }
        }

        return a;
    }
});