1988 Stimmen

Zusammenführen von zwei Arrays in JavaScript und Duplizieren von Elementen

Ich habe zwei JavaScript-Arrays:

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

Ich möchte, dass die Ausgabe so aussieht:

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

Im Ausgabe-Array sollten wiederholte Wörter entfernt werden.

Wie kann ich zwei Arrays in JavaScript zusammenführen, so dass ich nur die eindeutigen Elemente aus jedem Array in der gleichen Reihenfolge erhalte, in der sie in die ursprünglichen Arrays eingefügt wurden?

2311voto

LiraNuna Punkte 61060

So führen Sie die Arrays einfach zusammen (ohne Duplikate zu entfernen)

Verwendung der ES5-Version Array.concat :

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

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

Verwendung der ES6-Version Destrukturierung

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

Da es keine 'eingebaute' Möglichkeit gibt, Duplikate zu entfernen ( ECMA-262 hat tatsächlich Array.forEach was in diesem Fall sehr hilfreich wäre), müssen wir dies manuell tun:

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;
};

Dann, um sie zu benutzen:

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

Dadurch wird auch die Reihenfolge der Arrays beibehalten (d.h. keine Sortierung erforderlich).

Da sich viele Menschen über die prototypische Vergrößerung der Array.prototype y for in Loops, hier ist eine weniger invasive Art, sie zu verwenden:

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));

Diejenigen, die das Glück haben, mit Browsern zu arbeiten, in denen ES5 verfügbar ist, können Folgendes verwenden Object.defineProperty wie diese:

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;
    }
});

665voto

GijsjanB Punkte 9770

Mit Underscore.js oder Lo-Dash können Sie das tun:

console.log(_.union([1, 2, 3], [101, 2, 1, 10], [2, 1]));

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>

http://underscorejs.org/#union

http://lodash.com/docs#union

451voto

Abdennour TOUMI Punkte 75271
[...array1,...array2] //   =>  don't remove duplication 

OR

[...new Set([...array1 ,...array2])]; //   => remove duplication

424voto

simo Punkte 14048

Verketten Sie zunächst die beiden Arrays und filtern Sie dann nur die eindeutigen Elemente heraus:

var a = [1, 2, 3], b = [101, 2, 1, 10]
var c = a.concat(b)
var d = c.filter((item, pos) => c.indexOf(item) === pos)

console.log(d) // d is [1, 2, 3, 101, 10]

bearbeiten

Wie vorgeschlagen, wäre eine leistungsfähigere Lösung das Herausfiltern der eindeutigen Elemente in b vor der Verkettung mit a :

var a = [1, 2, 3], b = [101, 2, 1, 10]
var c = a.concat(b.filter((item) => a.indexOf(item) < 0))

console.log(c) // c is [1, 2, 3, 101, 10]

285voto

Adria Punkte 8078

Dies ist eine ECMAScript 6-Lösung mit Spread-Operator und Array-Generika.

Derzeit funktioniert es nur mit Firefox und möglicherweise mit der technischen Vorschau von Internet Explorer.

Aber wenn Sie die Babel können Sie es jetzt haben.

const input = [
  [1, 2, 3],
  [101, 2, 1, 10],
  [2, 1]
];
const mergeDedupe = (arr) => {
  return [...new Set([].concat(...arr))];
}

console.log('output', mergeDedupe(input));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X