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?

2voto

Billy Moon Punkte 54553

Unter der Annahme, dass die ursprünglichen Arrays nicht de-dupliziert werden müssen, sollte dies ziemlich schnell sein, die ursprüngliche Reihenfolge beibehalten und die ursprünglichen Arrays nicht verändern...

function arrayMerge(base, addendum){
    var out = [].concat(base);
    for(var i=0,len=addendum.length;i<len;i++){
        if(base.indexOf(addendum[i])<0){
            out.push(addendum[i]);
        }
    }
    return out;
}

Verwendung:

var array1 = ["Vijendra","Singh"];
var array2 = ["Singh", "Shakya"];
var array3 = arrayMerge(array1, array2);

console.log(array3);
//-> [ 'Vijendra', 'Singh', 'Shakya' ]

2voto

Karan Patokar Punkte 385

Sie können verwenden loadash unionWith - _.unionWith([arrays], [comparator])

Diese Methode ist wie _.union, außer dass sie einen Komparator akzeptiert, der aufgerufen wird, um Elemente von Arrays zu vergleichen. Die Ergebniswerte werden aus dem ersten Array ausgewählt, in dem der Wert vorkommt. Der Komparator wird mit zwei Argumenten aufgerufen: (arrVal, othVal).

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

var array3 = _.unionWith(array1, array2, _.isEqual);
console.log(array3);

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

2voto

Omu Punkte 67085

Es sieht so aus, als ob die akzeptierte Antwort in meinen Tests die langsamste ist;

beachten Sie, dass ich 2 Arrays von Objekten zusammenführe, indem ich Schlüssel

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width">
  <title>JS Bin</title>
</head>
<body>
<button type='button' onclick='doit()'>do it</button>
<script>
function doit(){
    var items = [];
    var items2 = [];
    var itemskeys = {};
    for(var i = 0; i < 10000; i++){
        items.push({K:i, C:"123"});
        itemskeys[i] = i;
    }

    for(var i = 9000; i < 11000; i++){
        items2.push({K:i, C:"123"});
    }

    console.time('merge');
    var res = items.slice(0);

    //method1();
    method0();
    //method2();

    console.log(res.length);
    console.timeEnd('merge');

    function method0(){
        for(var i = 0; i < items2.length; i++){
            var isok = 1;
            var k = items2[i].K;
            if(itemskeys[k] == null){
                itemskeys[i] = res.length;
                res.push(items2[i]);
            }
        }
    }

    function method1(){
        for(var i = 0; i < items2.length; i++){
            var isok = 1;
            var k = items2[i].K;

            for(var j = 0; j < items.length; j++){
                if(items[j].K == k){
                    isok = 0;
                    break;
                }
            }

            if(isok) res.push(items2[i]);
        }  
    }

    function method2(){
        res = res.concat(items2);
        for(var i = 0; i < res.length; ++i) {
            for(var j = i+1; j < res.length; ++j) {
                if(res[i].K === res[j].K)
                    res.splice(j--, 1);
            }
        }
    }
}
</script>
</body>
</html>

2voto

AlexTR Punkte 742

Hier handelt es sich um das effektivste Verfahren, was die Rechenzeit angeht. Außerdem wird die ursprüngliche Reihenfolge der Elemente beibehalten.

Zuerst werden alle Duplikate aus dem zweiten Array herausgefiltert, dann wird das, was übrig bleibt, mit dem ersten Array verkettet.

var a = [1,2,3];
var b = [5,4,3];
var c = a.concat(b.filter(function(i){
    return a.indexOf(i) == -1;
}));
console.log(c); // [1, 2, 3, 5, 4]

Hier ist eine leicht verbesserte (schnellere) Version davon, mit dem Nachteil, dass in Arrays keine Werte fehlen dürfen:

var i, c = a.slice(), ci = c.length;
for(i = 0; i < b.length; i++){
    if(c.indexOf(b[i]) == -1)
        c[ci++] = b[i];
}

2voto

Slmmgdd Punkte 147

Reduzieren Sie sie !!!

Bei dieser Alternative wird ein Array nicht explizit zusammengeführt und dedupliziert, sondern es wird ein Array genommen und mit einem anderen Array reduziert, so dass jeder Wert des ersten Arrays in einem akkumulativen Verhalten iteriert und destrukturiert werden kann, wobei die bereits enthaltenen Werte ignoriert werden, indem die Persistenz des Arrays aufgrund der Rekursivität ausgenutzt wird.

array2.reduce(reducer, array1.reduce(reducer, []))

Testbeispiel:

var array1 = ["Vijendra","Singh","Singh"];
var array2 = ["Singh", "Shakya", "Shakya"];
const reducer = (accumulator, currentValue) => accumulator.includes(currentValue) ? accumulator : [...accumulator, currentValue];

console.log(
  array2.reduce(reducer, array1.reduce(reducer, []))
);

// a reduce on first array is needed to ensure a deduplicated array used as initial value on the second array being reduced

Schlussfolgerung

Weitaus eleganter und nützlicher als langweilig for-each Ansatz vermieden werden soll (nicht, dass er nicht nützlich wäre).

Beschäftigt sich mit dem concat() Einschränkungen bei der Deduplizierung.

Sie benötigen weder externe Bibliotheken wie Underscore.js, JQuery oder Lo-Dash noch müssen Sie sich die Mühe machen, eine integrierte Funktion zu erstellen, um den gewünschten kombinierten und deduplizierten Effekt zu erzielen.

Oh, und HEY!, das kann man auch als Einzeiler machen!!!


Diese Antwort war möglich dank der ES5 (ECMAScript 2015), schön include() und prächtig reduce() .

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