2016-01-20 7 views
34


Ich möchte den besten Weg zu Filter ein Array von allen Elementen eines anderen zu verstehen. Ich habe es mit der Filterfunktion versucht, aber es kommt mir nicht, wie ich ihm die Werte geben soll, die ich entfernen möchte.
etwas wie:Wie man ein Array von allen Elementen eines anderen Arrays filtert

var array = [1,2,3,4]; 
var anotherOne = [2,4]; 
var filteredArray = array.filter(myCallback); 
// filteredArray should now be [1,3] 


function myCallBack(){ 
    return element ! filteredArray; 
    //which clearly can't work since we don't have the reference <,< 
} 

, falls die Filterfunktion nicht usefull ist, wie würden Sie dies umsetzen?
Edit: Ich überprüfte die mögliche doppelte Frage, und es könnte für diejenigen nützlich sein, die Javascript einfach verstehen. Die als gut gewertete Antwort macht es einfach.

+4

Geben die andere Anordnung Rückruf zu filtern und verwenden 'Rück arrTwo .indexOf (e) === -1; '** Code: **' var filteredArr = ersterArr.filter (el => secondArr.IndexOf (el) === -1); ' – Tushar

+1

Mögliches Duplikat von [.filter() Array mit den Elementen eines anderen Arrays] (http://stackoverflow.com/questi ons/7353917/filter-array-using-another-arrays-elements) –

+0

sind beide Arrays geordnet? –

Antwort

43

Sie können die „dieses“ Parameter des Filters() Funktion verwenden, um zu vermeiden Ihre Filteranordnung in einer globalen Variablen zu speichern.

var filtered=[1,2,3,4].filter(function(e){return this.indexOf(e)<0;},[2,4]); 
+0

Es funktioniert wie ein Charme. Ist es möglich, die Funktion nach außen zu verschieben und verständlicher zu gestalten? Wie: var filtered = [1,2,3,4] .filter (myfunct(), [2,4]); – Koop4

+0

Sicher: var myFunct = Funktion (e) {return this.indexOf (e) <0;}; var filtered = [1,2,3,4] .filter (myFunct, [2,4]); –

+0

Kann dies mit Lambda-Ausdruck in ES2016 oder TypesScript erreicht werden? –

0

Sie können Setup zugewiesen Filterfunktion, um über das "Filterarray" zu iterieren.

var arr = [1, 2, 3 ,4 ,5, 6, 7]; 
var filter = [4, 5, 6]; 

var filtered = arr.filter(
    function(val) { 
    for (var i = 0; i < filter.length; i++) { 
     if (val == filter[i]) { 
     return false; 
     } 
    } 
    return true; 
    } 
); 
17
var array = [1,2,3,4]; 
var anotherOne = [2,4]; 
var filteredArray = array.filter(myCallBack); 

function myCallBack(el){ 
    return anotherOne.indexOf(el) < 0; 
} 

Im Rückruf, überprüfen Sie, ob jeder Wert von array in anotherOne

ist https://jsfiddle.net/0tsyc1sx/

Wenn Sie lodash.js verwenden, verwenden _.difference

filteredArray = _.difference(array, anotherOne); 

Demo

Wenn Sie ein Array von Objekten:

var array = [{id :1, name :"test1"},{id :2, name :"test2"},{id :3, name :"test3"},{id :4, name :"test4"}]; 

var anotherOne = [{id :2, name :"test2"}, {id :4, name :"test4"}]; 

var filteredArray = array.filter(function(array_el){ 
    return anotherOne.filter(function(anotherOne_el){ 
     return anotherOne_el.id == array_el.id; 
    }).length == 0 
}); 

Demo array of objects

Demo diff array of objects with lodash

+0

Hallo, können Sie diese in einer Reihe von Objekten erweitern? Ich werde es sehr schätzen –

+0

Verwenden Sie Lodash? – AshBringer

+0

Nein Sir, ich bevorzuge die Callback-Methode –

1

Sie die Filter verwenden können, und dann für die Filterfunktion eine Verringerung des Filterarrays verwendet werden, die überprüft und gibt true zurück, wenn es eine Übereinstimmung findet, und kehrt dann bei return (!) um. Die Filterfunktion wird einmal pro Element im Array aufgerufen. Sie führen keinen Vergleich der Elemente in der Funktion in Ihrem Beitrag durch.

var a1 = [1, 2, 3, 4], 
 
    a2 = [2, 3]; 
 

 
var filtered = a1.filter(function(x) { 
 
    return !a2.reduce(function(y, z) { 
 
    return x == y || x == z || y == true; 
 
    }) 
 
}); 
 

 
document.write(filtered);

0

var arr1= [1,2,3,4]; 
 
var arr2=[2,4] 
 

 
function fil(value){ 
 
return value !=arr2[0] && value != arr2[1] 
 
} 
 

 
document.getElementById("p").innerHTML= arr1.filter(fil)
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
</head> 
 
<body> 
 
<p id="p"></p>

+0

Danke, es funktioniert, aber ich würde es vorziehen, den lokalen Bereich zu behalten. Auch der arr2 hat eine zufällige Anzahl von Elementen. – Koop4

0

function arr(arr1,arr2){ 
 
    
 
    function filt(value){ 
 
    return arr2.indexOf(value) === -1; 
 
    } 
 
    
 
    return arr1.filter(filt) 
 
    } 
 

 
document.getElementById("p").innerHTML = arr([1,2,3,4],[2,4])
<p id="p"></p>

20

ich wie folgt tun würde;

var arr = [1,2,3,4], 
 
    brr = [2,4], 
 
    res = arr.filter(f => !brr.includes(f)); 
 
console.log(res);

+2

Rockstar. Danke, das war unglaublich hilfreich, um ein etwas anderes Problem zu lösen. Herausfiltern eines Arrays von Objekten basierend auf einem Array von Werten in einer react-Komponente: '' 'const filteredResults = this.state.cards.Filter ( Ergebnis =>! this.state.filterOut.includes (result.category) ) '' 'where this.state.cards in einem Array von Objekten und this.state.filterOut ist ein Array von Werten, die dem ' Kategorie 'Schlüssel in den Objekten, die ich entfernen wollte. –

1

Ein flexibler Filterarray aus einer anderen Anordnung, die Gegenstand enthalten Eigenschaften

function filterFn(array, diffArray, prop, propDiff) { 
 
    diffArray = !propDiff ? diffArray : diffArray.map(d => d[propDiff]) 
 
    this.fn = f => diffArray.indexOf(f) === -1 
 
    if (prop) { 
 
     return array.map(r => r[prop]).filter(this.fn) 
 
    } else { 
 
     return array.filter(this.fn) 
 
    } 
 
} 
 

 
//You can use it like this; 
 

 
var arr = []; 
 

 
for (var i = 0; i < 10; i++) { 
 
    var obj = {} 
 
    obj.index = i 
 
    obj.value = Math.pow(2, i) 
 
    arr.push(obj) 
 
} 
 

 
var arr2 = [1, 2, 3, 4, 5] 
 

 
var sec = [{t:2}, {t:99}, {t:256}, {t:4096}] 
 

 
var log = console.log.bind(console) 
 

 
var filtered = filterFn(arr, sec, 'value', 't') 
 

 
var filtered2 = filterFn(arr2, sec, null, 't') 
 

 
log(filtered, filtered2)

0

Sie können eine generische filterByIndex() Funktion schreiben, und die Verwendung machen von Typrückschluss in TS, um den Ärger mit dem Callbac zu sparen k-Funktion:

Angenommen, Sie haben Ihr Array [1,2,3,4], das Sie filtern möchten() mit den im Array [2,4] angegebenen Indizes.

var filtered = [1,2,3,4,].filter(byIndex(element => element, [2,4])) 

die byIndex Funktion erwartet die Elementfunktion und eine Anordnung und wie folgt aussieht:

byIndex = (getter: (e:number) => number, arr: number[]) => (x: number) => { 
    var i = getter(x); 
    return arr.indexOf(i); 
} 

Ergebnis ist dann

filtered = [1,3] 
Verwandte Themen