Chciałbym porównać wiele tablic i wreszcie mieć tablicę, która zawiera wszystkie unikalne wartości z innej tablicy. Starałem się:
1, Użyj metody filtrowania, aby porównać różnicę między 2 tablicami
2, Wywołaj pętlę for, aby wprowadzić tablice do metody filtrowania
a kod jest następujący
function diffArray(arr1, arr2) {
function filterfunction (arr1, arr2) {
return arr1.filter(function(item) {
return arr2.indexOf(item) === -1;
});
}
return filterfunction (arr1,arr2).concat(filterfunction(arr2,arr1));
}
function extractArray() {
var args = Array.prototype.slice.call(arguments);
for (var i =0; i < args.length; i++) {
diffArray(args[i],args[i+1]);
}
}
extractArray([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3]);
Jednak to nie działa i zwraca komunikat o błędzie „Nie można odczytać właściwości„ indexOf ”niedokładnego„ .... Co jest nie tak z logiką i co powinienem zmienić, aby działała?
Bardzo dziękuję za pomoc z góry!
Re: Dla wszystkich, którzy zaznaczają ten problem jako zduplikowany ... to, czego szukam, to rozwiązanie, które pozwala mi umieścić tyle tablic, ile chcę dla danych wejściowych i zmniejszyć całą różnicę (np. dane wejściowe 10000 tablic i zwrócić 1 tablicę dla unikalnej wartości), ale nie tylko porównanie 2 tablic .. Rozwiązania, które widziałem, zawsze dotyczą tylko 2 tablic.
Odpowiedzi:
0 dla odpowiedzi № 1Nie używam filtrów ani niczego w tym rodzaju, ale wykona to zadanie. Najpierw tworzę pustą tablicę i concat
następna tablica. Następnie przekazuję go, aby usunąć duplikaty i zwracam nowo „przefiltrowaną” tablicę z powrotem do użycia.
function deleteDuplicates(a){
for(var i = a.length - 1; i >= 0; i--){
if(a.indexOf(a[i]) !== i){
a.splice(i, 1);
}
}
return a;
}
function extractArray() {
var args = Array.prototype.slice.call(arguments), arr = [];
for (var i = 0; i < args.length; i++) {
arr = deleteDuplicates(arr.concat(args[i]));
}
return arr;
}
var arr = extractArray([3, 3, 3, 2, 5], [2, 1, 5, 7], [3, 4, 6, 6], [1, 2, 3]);
console.log(arr) //[3, 2, 5, 1, 7, 4, 6]