2017-09-06 3 views
1

Ich versuche (in js oder jquery) Array von Objekten zu filtern und Array von Objekten, die bestimmten Eigenschaftennamen haben.JS - Filter Array von Objekten nach Array von Eigenschaftswerten und Rückgabe Array gefilterter Objekte

versuchte ich filter und find Funktionen wie folgt aus:

var objs = [{ a:1, }, {a:2}, {a:3}, {a:4}] 
var vals = [1, 2] 

    function callback(obj) { 
     var arr = arr || [] 
     console.log(arr) 
     $.each(vals, function(key, val) { 
      if (val == obj.a) { 
       arr.push(obj) 
      } 
     }) 
    } 

    var result = objs.find(callback); 

    console.log(">>>", result) 

Erwartetes Ergebnis ist:

result = [{a:1}, {a:2}] 

aber es nicht funktioniert, weil jeder Iteration von find beginnt immer und arr alle immer wieder definiert.

Ich könnte natürlich machen ist mit zwei verschachtelten $.each() - eins, um durch Array von Objekten zu durchlaufen und zweitens durch Array von Eigenschaftswerten zu durchlaufen, aber ich denke, ist als letzte Option - auf der Suche nach etwas eleganter, kürzer. Habt ihr Ideen?

Antwort

0

Sie könnten es mit einem filter und indexOf tun.

var objs = [{ a:1, }, {a:2}, {a:3}, {a:4}] 
 
var vals = [1, 2] 
 

 

 
function filterByValue(source, allowedValues) { 
 
    // Return the result of the filter. 
 
    return source.filter(item => { 
 
    // Returns true when `a` is present in vals (index > -1); otherwise it returns false. 
 
    return allowedValues.indexOf(item.a) > -1; 
 
    }); 
 
} 
 

 
const 
 
    filteredArray = filterByValue(objs, vals); 
 

 
console.log(filteredArray)

+0

@DZack Messe Punkt, freut sich auf Ihre Lösung. – Thijs

0

Thijs Antwort funktioniert, wird aber unperformant erhalten, wie die vals Array groß wird. Um O (n) Komplexität zu erhalten, können Sie einen Satz aus dem allowedValues Array bauen:

var objs = [{ a:1, }, {a:2}, {a:3}, {a:4}] 
 
var vals = [1, 2] 
 

 
function filterByValue(source, allowedValues) { 
 

 
    allowedValues = new Set(allowedValues) 
 
    // Return the result of the filter. 
 

 
    return source.filter(item => { 
 
    // Returns true when `a` is present in vals, otherwise it returns false. 
 
     return allowedValues.has(item.a); 
 
    }); 
 
} 
 
const filteredArray = filterByValue(objs, vals); 
 

 
console.log(filteredArray)

+0

@Kalreg Wenn dies Ihre Frage beantwortet, können Sie es als die akzeptierte Antwort markieren? – DZack