2017-10-26 22 views
1

I ArrayWie Sammlung von Array-Elementen filtern

"categories": [ 
    { 
    "type": "A",    
    "subtype": [ 
     "X", 
     "Y", 
     "Z", 
     "D", 
     "E"   
    ], 

    }, 
    { 
    "type": "B", 
    "Subtypes": [ 
     "0", 
     "1", 
     "2", 
     "3", 
     "4", 
     "5" 
    ],   
    }, 
    { 
    "type": "C",   
    "includeConnectionTypes": [ 
     "@", 
     "#", 
     "$" 
    ], 
}] 

Ich habe zweiten Array Array B

B = ["C","A"] 

jetzt, wie man Filterelemente in der Kategorie Array in folgendem Format basiert habe auf Elemente in Array B

+0

A [t] .type === B [i]? ... .... das ist deine benötigt? –

+1

können Sie über [Filterfunktion] lesen (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter) – HoangNK

+0

Gibt es eine lodash Funktion, um das gleiche zu tun? –

Antwort

0

Ich denke, das ist, was Sie brauchen: _.filter.

_.filter(categories, (item => B.indexOf(item.type)>= 0)); 
1

ES5

var result = categories.filter(function (item) { 
    return B.indexOf(item.type) > -1;  
}); 

ES6

var result = categories.filter(item => B.indexOf(item.type) > -1); 

Diese Erklärung wird jedes Element von "Kategorien" array prüft man, ob diese Art ist ein Element von Array B, das wird zum "Ergebnis" Array geschoben.

"indexOf" -Methode gibt den Index eines Elements in einem Array zurück, und wenn dieses Array dieses Element nicht enthält, gibt diese Methode -1 zurück.

Referenz: Array.prototype.filter()

2
var categories=[ 
    { 
    "type": "A",    
    "subtype": [ 
     "X", 
     "Y", 
     "Z", 
     "D", 
     "E"   
    ], 

    }, 
    { 
    "type": "B", 
    "Subtypes": [ 
     "0", 
     "1", 
     "2", 
     "3", 
     "4", 
     "5" 
    ],   
    }, 
    { 
    "type": "C",   
    "includeConnectionTypes": [ 
     "@", 
     "#", 
     "$" 
    ], 
}]; 

Es ist ein Array, jetzt B ist auch Array

var B = ["C","A"] 

var result=categories.filter(function(d){ 
    return B.indexOf(d.type)!=-1; 
}); 

"Ergebnis" enthält Ihr erwartetes Ergebnis.

0

Eine Kombination aus Array.prototype.filter und die gebundenen Nutzung von Array.prototype.some sollte einen gut lesbaren Ansatz machen, die auch den Vorteil, Code-Wiederverwendung über eine einzige spezielle Funktion wie doesCategoryTypeMatchAnyBoundType hat, die anders als die anderen Ansätze/Lösungen, die filter und indexOf kombinieren tun , muss die Referenz der Filtertypliste nicht "kennen" (dort B aus dem angegebenen Beispiel).

// Q: I am having array in following format ... 
 

 
var categories = [{ 
 
    "type": "A", 
 
    "subtype": ["X", "Y", "Z", "D", "E"] 
 
}, { 
 
    "type": "B", 
 
    "Subtypes": ["0", "1", "2", "3", "4", "5"] 
 
}, { 
 
    "type": "C", 
 
    "includeConnectionTypes": ["@", "#", "$"] 
 
}]; 
 

 
// ... I am having 2nd array array ... 
 

 
var typeList = ["C","A"]; 
 

 
// ... now how to filter elements in category array based on 
 
// elements in ... `typeList` ... array ... 
 

 

 
// A: a combination of `Array.prototype.filter` and 
 
// the bound usage of `Array.prototype.some` should make 
 
// a well readable approach ... 
 

 
function doesCategoryTypeMatchAnyBoundType(categoryItem) { 
 
    return this.some(function (type) { return (categoryItem.type === type); }); 
 
} 
 

 
var filteredCategoryList = categories.filter(doesCategoryTypeMatchAnyBoundType, typeList); 
 

 
console.log("filteredCategoryList : ", filteredCategoryList);
.as-console-wrapper { max-height: 100%!important; top: 0; }

gibt es eine lodash Funktion das gleiche zu tun?

Versuchen Sie, so lange wie möglich mit dem Sprachkern zu bleiben. Aber wenn Sie gezwungen sind, lodash verwenden, die nur zur Verfügung gestellt Ansatz würde sich ändern, zu ...

var categories = [{ 
 
    "type": "A", 
 
    "subtype": ["X", "Y", "Z", "D", "E"] 
 
}, { 
 
    "type": "B", 
 
    "Subtypes": ["0", "1", "2", "3", "4", "5"] 
 
}, { 
 
    "type": "C", 
 
    "includeConnectionTypes": ["@", "#", "$"] 
 
}]; 
 

 
var typeList = ["C","A"]; 
 

 

 
function doesCategoryTypeMatchAnyBoundType(categoryItem) { 
 
    return _.some(this, function (type) { return (categoryItem.type === type); }); 
 
} 
 

 
var filteredCategoryList = _.filter(categories, doesCategoryTypeMatchAnyBoundType.bind(typeList)); 
 

 
console.log("filteredCategoryList : ", filteredCategoryList);
.as-console-wrapper { max-height: 100%!important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

Verwandte Themen