JavaScriptで2つの配列をマージしてアイテムの重複をなくす方法

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

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版では[destructuring][2]を使用します。

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

重複を削除する「組み込み」の方法がないので([ECMA-262][1]には実際に Array.forEach があり、これは素晴らしいことです)、手動で行う必要があります。


Array.prototype.unique = function() {
    var a = this.concat();
    for(var i=0; i
解説 (16)

新しいソリューション(Array.prototype.indexOfArray.prototype.concatを使用しています)。


Array.prototype.uniqueMerge = function( a ) {
    for ( var nonDuplicates = [], i = 0, l = a.length; i
解説 (16)
//Array.indexOf was introduced in javascript 1.6 (ECMA-262) 
//We need to implement it explicitly for other browsers, 
if (!Array.prototype.indexOf)
{
  Array.prototype.indexOf = function(elt, from)
  {
    var len = this.length >>> 0;

    for (; from < len; from++)
    {
      if (from in this &&
          this[from] === elt)
        return from;
    }
    return -1;
  };
}
//now, on to the problem

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

var merged = array1.concat(array2);
var t;
for(i = 0; i < merged.length; i++)
  if((t = merged.indexOf(i + 1, merged[i])) != -1)
  {
    merged.splice(t, 1);
    i--;//in case of multiple occurrences
  }

他のブラウザでのindexOfメソッドの実装はMDCから引用しています。

解説 (6)