Como fundir duas matrizes em JavaScript e desduplicar itens

Eu tenho duas matrizes de JavaScript:

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

Eu quero que a saída seja:

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

A matriz de saída deve ter palavras repetidas removidas.

Como fundir duas matrizes em JavaScript para que eu receba apenas os itens únicos de cada matriz na mesma ordem em que foram inseridos nas matrizes originais?

Solução

Para fundir apenas as matrizes (sem remover duplicados)

ES5 versão utilize Array.concat:

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

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

ES6 versão use [desestruturação][2]

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

Uma vez que não existe uma forma 'incorporada' de remover duplicados ([ECMA-262][1] na verdade tem 'Array.forEach', o que seria ótimo para isso), temos que fazer isso manualmente:


Array.prototype.unique = function() {
    var a = this.concat();
    for(var i=0; i
Comentários (16)

Nova solução ( que utiliza Array.prototype.indexOf e Array.prototype.concat ):


Array.prototype.uniqueMerge = function( a ) {
    for ( var nonDuplicates = [], i = 0, l = a.length; i
Comentários (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
  }

A implementação do método indexOf para outros navegadores é tirada de MDC.

Comentários (6)