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?

1voto

vitaly-t Punkte 22010

In der heutigen Zeit etwas Einfacheres und Eleganteres anzubieten, das eine bestehende Bibliothek nutzt:

import {pipe, concat, distinct} from 'iter-ops';

// our inputs:
const array1 = ['Vijendra', 'Singh'];
const array2 = ['Singh', 'Shakya'];

const i = pipe(
    array1,
    concat(array2), // adding array
    distinct() // making it unique
);

console.log([...i]); //=> ['Vijendra', 'Singh', 'Shakya']

Es ist sehr leistungsfähig, da wir nur einmal iterieren, und der Code ist sehr einfach zu lesen.

P.S. Ich bin der Autor von iter-ops .

1voto

David Kirk Punkte 302

Dies ist meine zweite Antwort, aber ich glaube, die schnellste? Ich würde mich freuen, wenn jemand das für mich überprüft und in den Kommentaren antwortet.

Bei meinem ersten Versuch erreichte ich etwa 99k ops/sec und bei diesem Versuch sind es 390k ops/sec gegenüber dem anderen führenden jsperf-Test von 140k (für mich).

http://jsperf.com/merge-two-arrays-keeping-only-unique-values/26

Ich habe dieses Mal versucht, die Interaktion mit dem Array so weit wie möglich zu minimieren, und es sah so aus, als hätte ich etwas Leistung gewonnen.

function findMerge(a1, a2) {
    var len1 = a1.length;

    for (var x = 0; x < a2.length; x++) {
        var found = false;

        for (var y = 0; y < len1; y++) {
            if (a2[x] === a1[y]) {
                found = true;
                break;
            }
        }

        if(!found){
            a1.push(a2.splice(x--, 1)[0]);
        }
    }

    return a1;
}

Edit: Ich habe einige Änderungen an meiner Funktion vorgenommen, und die Leistung ist drastisch im Vergleich zu anderen auf der jsperf-Website.

1voto

Zach Lewis Punkte 11
var MergeArrays=function(arrayOne, arrayTwo, equalityField) {
    var mergeDictionary = {};

    for (var i = 0; i < arrayOne.length; i++) {
        mergeDictionary[arrayOne[i][equalityField]] = arrayOne[i];
    }

    for (var i = 0; i < arrayTwo.length; i++) {
        mergeDictionary[arrayTwo[i][equalityField]] = arrayTwo[i];
    }

    return $.map(mergeDictionary, function (value, key) { return value });
}

Leveraging Wörterbücher und Jquery könnten Sie die beiden Arrays zusammenführen und nicht erhalten Duplikate. In meinem Beispiel verwende ich ein bestimmtes Feld auf das Objekt, aber könnte nur das Objekt selbst sein.

1voto

Jason Matthews Punkte 26

Wenn Sie nach eindeutigen Objekten suchen wollen, verwenden Sie JSON.stringify in Ihrem Vergleich.

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(JSON.stringify(a[i]) === JSON.stringify(a[j]))
                a.splice(j--, 1);
        }
    }

    return a;
}

1voto

StickyBandit Punkte 11
Array.prototype.union = function (other_array) {
/* you can include a test to check whether other_array really is an array */
  other_array.forEach(function(v) { if(this.indexOf(v) === -1) {this.push(v);}}, this);    
}

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