Javascript过滤具有另一个数组的关联数组
如何用另一个关联数组过滤关联数组Javascript过滤具有另一个数组的关联数组,javascript,arrays,Javascript,Arrays,如何用另一个关联数组过滤关联数组 function filter (a,f) { console.log (a) ; console.log (f) ; //Using f as filter, How to get only these rows fom a ? //{"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"}, //{"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"},
function filter (a,f) {
console.log (a) ;
console.log (f) ;
//Using f as filter, How to get only these rows fom a ?
//{"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"},
//{"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"},
}
function test() {
var data = [{"XD_A":"XDL","XD_B_1":"38","XD_B_2":"PB"},
{"XD_A":"XDR","XD_B_1":"51","XD_B_2":"PB"},
{"XD_A":"XDL","XD_B_1":"58","XD_B_2":"PB"},
{"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"},
{"XD_A":"XDL","XD_B_1":"76","XD_B_2":"PB"},
{"XD_A":"XDR","XD_B_1":"38","XD_B_2":"PB"}] ;
var filters =[{"XD_A":"XDR"},{"XD_B_1":"38"}] ;
filter (data,filters) ;
}
提前感谢,
致意
马西莫
let data=[{“XD_A”:“XDL”,“XD_B_1”:“38”,“XD_B_2”:“PB”},
{“XD_A”:“XDR”,“XD_B_1”:“51”,“XD_B_2”:“PB”},
{“XD_A”:“XDL”,“XD_B_1”:“58”,“XD_B_2”:“PB”},
{“XD_A”:“XDR”,“XD_B_1”:“38”,“XD_B_2”:“一”},
{“XD_A”:“XDL”,“XD_B_1”:“76”,“XD_B_2”:“PB”},
{“XD_A”:“XDR”,“XD_B_1”:“38”,“XD_B_2”:“两”}],
过滤器=[{“XD_A”:“XDR”},{“XD_B_1”:“38”}];
控制台信息(过滤器(数据,过滤器));
函数过滤器(d,f){
返回数据。过滤器(e=>{
试一试{
f、 forEach(o=>{
Object.keys(o).forEach(key=>{
如果(e[键]!==o[键])抛出新的1;
});
});
返回true;
}捕获(e){
返回false;
}
});
}
您可以在不使用try catch
块的情况下调整阵列
函数过滤器(数据,过滤器){
返回数据。过滤器(函数(d){
返回过滤器。每个(函数(f){
var k=Object.keys(f)[0];
返回d[k]==f[k];
});
});
}
“38”、“XD\U B\U 2”:“38”、“XDU B\U 2”:“PB”},,{“XDU A A”:“XDR”、“XDR”、“XDU U A A”:“XDR”、“XDR”、“XDU U B\U A A”:“51”、“51”、“51”、“XDU U A A A A A A”:“51”、“51”、“XDU U A A A A A A”:“XDL”、“XDU U U 1 1 1 1”:“38”、“38”、“XDL”、“XDL”、“XDU B\U 1周一周一周一周一”、“1”1”1”1除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了除了1以外,1以外,1个除了除了除了除了除了除了1以外,1以外,1““““““““”、“1”1”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”、“8”以及以及从从从从从从从从从从从从PB},{“XD_A”:“XDR”,“XD_B_1”:“38”,“XD_B_2”:“PB}],
过滤器=[{“XD_A”:“XDR”},{“XD_B_1”:“38”}];
日志(过滤器(数据,过滤器))代码>
.as控制台包装{最大高度:100%!重要;顶部:0;}
关联数组排序,hmmm?我想用一种非ES6的方式来做这件事(因为我在几分钟内就找到了它的解决方案;borrrrrring.JK我爱你ES6!)。我使用了你自己例子中的确切标准
这是一种非库、非ES6方式(以防万一,只是为了好玩),其中包括一些使用args的额外输出结果:包含
,结果
,严格
当过滤器需要增加/减少时,它也会缩放。注意:它不会以多个对象属性作为条件进行过滤,而是完全按照您发布的内容进行过滤:使用多个“关联数组”的数组项(但显然可以更改这一点)
这是我在SO上的第一篇帖子,在使用多年之后(对不起)。无论如何,希望它对你()和其他人有效,Massimo
PS-如果它是垃圾/马车,我会设法找时间帮你修理
/**
* _filterStrict only gives back data if both filter criteria are satisfied
* @param data {obj}
* filterList {arr}
* @returns bool
*/
var _filterStrict = function(data, filterList) {
var filterLength = filterList.length
// handy little truthy array
var strictMatchResults = []
for (var i = 0; i < filterLength; ++i) {
for (var prop in filterList[i]) {
// we need to match both the property and value
if (data.hasOwnProperty(prop) && data[prop] === filterList[i][prop]) {
strictMatchResults.push(true)
} else {
// no truthy for you! YOU CAN'T HANDLE THE TRUTH!
continue;
}
}
}
return strictMatchResults.length === filterLength ? true : false
}
/**
* _filterContains loose check; if data is found to be matching, it's a match.
* @param prop {str}
* val {str} // !could be extended to allow more types!
* filterList {arr}
* @returns bool
*/
var _filterContains = function(prop, val, filterList) {
var filterLength = filterList.length
var found = []
for (var i = 0; i < filterLength; ++i) {
// we need to match both the property and value
if (filterList[i].hasOwnProperty(prop) && filterList[i][prop] === val) {
return true
} else {
// "W-w-what? I have to go back to the expression, again? Ugh."
continue;
}
}
}
/**
* _filterChoose detects which filter to use via filterMode and selects
* the appropriate internal filter
* @param dataToCheck {obj}
* filterList {arr}
* filterMode {str}
* @returns arr
*/
var _filterChoose = function(dataToCheck, filterList, filterMode) {
var dataMatchesFilter = null
var initObjFlag = false
var filterLength = filterList.length
// run in "strict search" mode
if (filterMode === 'strict') {
return _filterStrict(dataToCheck, filterList) ? dataToCheck : null
}
// loop through slice of data
for (var prop in dataToCheck) {
var val = dataToCheck[prop]
// check against filter criteria
if (_filterContains(prop, val, filterList)) {
// only create the object literal once
if (initObjFlag === false) {
initObjFlag = true
dataMatchesFilter = {}
}
// only return the found results from the array
if (filterMode === 'results') {
dataMatchesFilter[prop] = val
}
// return the whole value if the data matches anywhere in the array
if (filterMode === 'contains' || filterMode === '' || filterMode === undefined) {
dataMatchesFilter = dataToCheck
}
}
}
return dataMatchesFilter
}
/**
* Filter "associative array" [{"str":"str"}]
* - Searches one level deep.
* - Filter Mode settings:
* * <contains|''|undefined> - loose search; returns whole object if even one * match is found. This is the default.
* * results - returns results only (does not include any other original values)
* * strict - returns a match only if *all* filter criteria are met
*
* @param data {arr}
* filterList {arr}
* filterMode {str} - possible values: '', contains', 'results', 'strict'
*/
var FilterAssoc = function(data, filterList, filterMode) {
// cache length for being nice to compiler guy/gal
var dataLength = data.length
var filteredArray = []
// loop through array to access the object literals
for (var i = 0; i < dataLength; ++i) {
var filterRes = _filterChoose(data[i], filterList, filterMode)
// if results from our internal filter methods are NOT "null",
// then we need those results!
if (filterRes !== null) {
// build our results
filteredArray.push(filterRes)
}
}
return filteredArray
}
var filteredData = FilterAssoc(data, filters, 'strict')
console.log(filteredData)
/**
*_filterStrict仅在满足两个筛选条件时返回数据
*@param data{obj}
*过滤器列表{arr}
*@returns bool
*/
var\u filterStrict=函数(数据,过滤器列表){
var filterLength=filterList.length
//灵巧的小特鲁西阵列
var strictMatchResults=[]
对于(变量i=0;i