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

Oliver Low Punkte 29

Dies ist schnell, vergleicht eine beliebige Anzahl von Arrays und funktioniert sowohl mit Zahlen als auch mit Strings.

function collate(a){ // Pass an array of arrays to collate into one array
    var h = { n: {}, s: {} };
    for (var i=0; i < a.length; i++) for (var j=0; j < a[i].length; j++)
        (typeof a[i][j] === "number" ? h.n[a[i][j]] = true : h.s[a[i][j]] = true);
    var b = Object.keys(h.n);
    for (var i=0; i< b.length; i++)
        b[i]=Number(b[i]);
    return b.concat(Object.keys(h.s));
}

> a = [ [1,2,3], [3,4,5], [1,5,6], ["spoon", "fork", "5"] ]
> collate( a )

[1, 2, 3, 4, 5, 6, "5", "spoon", "fork"]

Wenn Sie nicht zwischen 5 und "5" unterscheiden müssen, dann

function collate(a){
    var h = {};
    for (i=0; i < a.length; i++) for (var j=0; j < a[i].length; j++)
        h[a[i][j]] = typeof a[i][j] === "number";
    for (i=0, b=Object.keys(h); i< b.length; i++)
        if (h[b[i]])
            b[i]=Number(b[i]);
    return b;
}
[1, 2, 3, 4, "5", 6, "spoon", "fork"]

ausreichen wird.

Und wenn es Ihnen nichts ausmacht (oder Sie es vorziehen würden), dass alle Werte sowieso als Zeichenketten enden, dann nur dies:

function collate(a){
    var h = {};
    for (var i=0; i < a.length; i++)
        for (var j=0; j < a[i].length; j++)
            h[a[i][j]] = true;
    return Object.keys(h)
}
["1", "2", "3", "4", "5", "6", "spoon", "fork"]

Wenn Sie nicht wirklich ein Array benötigen, sondern nur die eindeutigen Werte sammeln und über sie iterieren wollen, dann (in den meisten Browsern (und node.js)):

h = new Map();
for (i=0; i < a.length; i++)
    for (var j=0; j < a[i].length; j++)
        h.set(a[i][j]);

Es könnte besser sein.

-1voto

Amr Ali Punkte 2068
/**
 * De-duplicate an array keeping only unique values.
 * Use hash table (js object) to filter-out duplicates.
 * The order of array elements is maintained.
 * This algorithm is particularly efficient for large arrays (linear time).
 */
function arrayUniqueFast(arr) {
    var seen = {};
    var result = [];
    var i, len = arr.length;
    for (i = 0; i < len; i++) {
        var item = arr[i];
        // hash table lookup
        if (!seen[item]) {
            result.push(item);
            seen[item] = true;
        }
    }
    return result;
}

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

var result = arrayUniqueFast(array1.concat(array2));
document.write('<br>result: ' + result);

Para andere Methoden um ein Array zu dedupfen, sehen Sie sich bitte meine Benchmarks an: https://jsperf.com/de-duplicate-an-array-keeping-only-unique-values

-1voto

John Henckel Punkte 8519

Bei zwei sortierten Arrays einfacher Typen ohne Duplikate werden diese in O(n)-Zeit zusammengeführt, und die Ausgabe ist ebenfalls sortiert.

function merge(a, b) {
    let i=0;
    let j=0;
    let c = [];
    for (;;) {
        if (i == a.length) {
            if (j == b.length) return c;
            c.push(b[j++]);
        } else if (j == b.length || a[i] < b[j]) {
            c.push(a[i++]);
        } else {
            if (a[i] == b[j]) ++i;   // skip duplicates
            c.push(b[j++]);
        }
    }
}

-1voto

Lightfooted Punkte 799

Ich habe gelernt, wie man mit dem Spread-Operator frech zwei Arrays verketten kann:

var array1 = ['tom', 'dick', 'harry'];
var array2 = ['martin', 'ricky'];

array1.push(...array2);

Der Spread-Operator "..." teilt das folgende Array in einzelne Elemente auf, die dann von push als separate Argumente behandelt werden können.

-1voto

Muzikant Punkte 7982

Sie können die Ergebnisse zusammenführen und die Duplikate herausfiltern:

let combinedItems = [];

// items is an Array of arrays: [[1,2,3],[1,5,6],...]    
items.forEach(currItems => {
    if (currItems && currItems.length > 0) {
        combinedItems = combinedItems.concat(currItems);
    }
});

let noDuplicateItems = combinedItems.filter((item, index) => {
    return !combinedItems.includes(item, index + 1);
});

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