JavaScript で 2 つの配列を結合して重複項目を削除する方法 質問する

JavaScript で 2 つの配列を結合して重複項目を削除する方法 質問する

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

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

出力は次のようになります:

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

出力配列では重複した単語が削除される必要があります。

JavaScript で 2 つの配列を結合して、元の配列に挿入されたのと同じ順序で各配列から一意の項目のみを取得するにはどうすればよいでしょうか。

ベストアンサー1

配列を結合するだけ(重複を削除せずに)

ES5バージョンの使用Array.concat:

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

array1 = array1.concat(array2);

console.log(array1);

2023年アップデート

元の回答は数年前のものです。ES6 は完全にサポートされており、IE はついに廃止されました。プリミティブ配列とオブジェクト配列をマージする最も簡単な方法は次のとおりです。

const merge = (a, b, predicate = (a, b) => a === b) => {
    const c = [...a]; // copy to avoid side effects
    // add all items from B to copy C if they're not already present
    b.forEach((bItem) => (c.some((cItem) => predicate(bItem, cItem)) ? null : c.push(bItem)))
    return c;
}

merge(['a', 'b', 'c'], ['c', 'x', 'd']);
// => ['a', 'b', 'c', 'x', 'd']

merge([{id: 1}, {id: 2}], [{id: 2}, {id: 3}], (a, b) => a.id === b.id);
// [{id: 1}, {id: 2}, {id: 3}]

元の回答

ES6バージョンの使用構造化解除

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

重複を削除する「組み込み」の方法がないので(ECMA-262実際にはArray.forEachこれに最適ですが、手動で行う必要があります。これによりArrayプロトタイプが汚染されるので、注意して使用してください。

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.prototype多くの人がとループのプロトタイプ拡張に悩まされているためfor 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 が利用可能なブラウザで作業できる場合は、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;
    }
});

おすすめ記事