de-vraag
  • Pytania
  • Tagi
  • Użytkownicy
Powiadomienia
Nagrody
Rejestracja
Po zarejestrowaniu się, będziesz otrzymywać powiadomienia o odpowiedziach i komentarzach do swoich pytań.
Zaloguj się
Brak tłumaczeń pasujących do Twojego wyszukiwania Jeśli masz już konto, zaloguj się, aby sprawdzić nowe powiadomienia.
Za dodane pytania, odpowiedzi i komentarze przewidziane są nagrody.
Więcej
Źródło
Edytuj
 Vijjendra
Vijjendra
Question

Jak połączyć dwie tablice w JavaScript i usunąć duplikaty elementów

Mam dwie tablice JavaScript:

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

Chcę, aby dane wyjściowe były:

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

Tablica wyjściowa powinna mieć usunięte powtarzające się słowa.

Jak połączyć dwie tablice w JavaScript tak, aby otrzymać tylko unikalne elementy z każdej tablicy w takiej samej kolejności, w jakiej zostały one wstawione do oryginalnych tablic?

1246 2009-10-18T08:34:57+00:00 3
Peter Mortensen
Peter Mortensen
Edytowane pytanie 18. października 2017 в 6:29
Programowanie
arrays
javascript
merge
To pytanie ma 1 odpowiedź w języku angielskim, aby je przeczytać zaloguj się na swoje konto.
Solution / Answer
 LiraNuna
LiraNuna
18. października 2009 в 8:42
2009-10-18T08:42:43+00:00
Więcej
Źródło
Edytuj
#9591011

Aby po prostu połączyć tablice (bez usuwania duplikatów)

ES5 wersja użyj Array.concat:

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

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

ES6 version use destructuring

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

Ponieważ nie ma 'wbudowanego' sposobu na usuwanie duplikatów (ECMA-262 właściwie ma Array.forEach, który byłby do tego świetny), musimy to robić ręcznie:

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

Następnie, aby go użyć:

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

To również zachowa kolejność tablic (tj. Nie będzie potrzebne sortowanie).

Ponieważ wiele osób jest zirytowanych prototypowym rozszerzeniem Array.prototype i pętlami for in, oto mniej inwazyjny sposób na jego użycie:

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

Dla tych, którzy mają szczęście pracować z przeglądarkami, w których ES5 jest dostępny, możesz użyć Object.defineProperty w ten sposób:

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;
    }
});
 dota2pro
dota2pro
Edytowana odpowiedź 20. września 2019 в 1:08
1544
0
meder omuraliev
meder omuraliev
18. października 2009 в 8:42
2009-10-18T08:42:01+00:00
Więcej
Źródło
Edytuj
#9591010

Nowe rozwiązanie ( które używa Array.prototype.indexOf i Array.prototype.concat ):

Array.prototype.uniqueMerge = function( a ) {
    for ( var nonDuplicates = [], i = 0, l = a.length; i<l; ++i ) {
        if ( this.indexOf( a[i] ) === -1 ) {
            nonDuplicates.push( a[i] );
        }
    }
    return this.concat( nonDuplicates )
};

Użycie:

>>> ['Vijendra', 'Singh'].uniqueMerge(['Singh', 'Shakya'])
["Vijendra", "Singh", "Shakya"]

Array.prototype.indexOf ( dla internet explorer ):

Array.prototype.indexOf = Array.prototype.indexOf || function(elt)
  {
    var len = this.length >>> 0;

    var from = Number(arguments[1]) || 0;
    from = (from < 0) ? Math.ceil(from): Math.floor(from); 
    if (from < 0)from += len;

    for (; from < len; from++)
    {
      if (from in this && this[from] === elt)return from;
    }
    return -1;
  };
meder omuraliev
meder omuraliev
Edytowana odpowiedź 18. października 2009 в 11:10
6
0
 Amarghosh
Amarghosh
18. października 2009 в 8:43
2009-10-18T08:43:35+00:00
Więcej
Źródło
Edytuj
#9591012
//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
  }

Implementacja metody indexOf dla innych przeglądarek została zaczerpnięta z MDC.

 Amarghosh
Amarghosh
Edytowana odpowiedź 18. października 2009 в 10:56
6
0
Dodaj pytanie
Kategorie
Wszystkie
Technologia
Kultura / Rekreacja
Życie / Sztuka
Nauka
Profesjonalny
Biznes
Użytkownicy
Wszystkie
Nowy
Popularny
1
Jasur Fozilov
Zarejestrowany 8 godzin temu
2
Zuxriddin Muydinov
Zarejestrowany 23 godziny temu
3
Денис Анненский
Zarejestrowany 3 dni temu
4
365
Zarejestrowany 1 tydzień temu
5
True Image
Zarejestrowany 1 tydzień temu
DA
DE
EL
ES
FI
FR
ID
IT
JA
NL
PL
PT
RU
TR
ZH
© de-vraag 2022
Źródło
stackoverflow.com
na podstawie licencji cc by-sa 3.0 z przypisaniem