[英]Why doesn't my filter function work? (Javascript).
我想要完成的是,能夠使用過濾功能過濾掉年齡為21歲的人和顏色:藍色。
有關如何使其工作的任何建議? 提前致謝。
這是我的代碼:
var arr = [ { name: 'Steve', age: 18, color: 'red' }, { name: 'Louis', age: 21, color: 'blue' }, { name: 'Mike', age: 20, color: 'green' }, { name: 'Greg', age: 21, color: 'blue' }, { name: 'Josh', age: 18, color: 'red' } ];
var filter = function(arr, criteria){
var filtered = []
for(var i=0; i<arr.length; i++){
if (arr[i] === criteria) {
filtered.push(arr[i])
}
return filtered;
}
}
console.log(filter(arr, { age: 21, color: 'blue' }));
var filter = function(arr, criteria){
return arr.filter( function(item){
return Object.keys(criteria).every(function(key) {
return item[key] == criteria[key];
});
});
}
你的解決方案不起作用的原因是因為你無法使用相等運算符比較兩個對象,所以你必須實際比較對象的屬性,使用像lodash這樣的庫或使用內置比較functino的下划線,或者寫一個深度等於自己運行迭代每個屬性的屬性,如果在任何時候它們不相等則返回false。
這是一個可能的解決方案:
var filter = function(arr, criteria){
var filtered = []
arr.forEach(function (item) {
if (item.age === criteria.age && item.color === criteria.color) {
filtered.push(item);
}
});
return filtered;
};
您必須遍歷Array中的這些對象並測試其屬性和屬性值。 這是一種向后兼容的方式:
function hasCompObjPropsAndVals(obj, compObj){
var l = 0, c = 0;
for(var i in compObj){
l++;
for(var p in obj){
if(i === p && compObj[i] === obj[p]){
c++;
break;
}
}
}
if(l !== 0 && l === c){
return true;
}
return false;
}
function filter(objArray, compObj){
var res = [];
for(var i=0,l=objArray.length; i<l; i++){
var o = objArray[i];
if(hasCompObjPropsAndVals(o, compObj)){
res.push(o);
}
}
return res;
}
var arr = [ { name: 'Steve', age: 18, color: 'red' }, { name: 'Louis', age: 21, color: 'blue' }, { name: 'Mike', age: 21, color: 'green' }, { name: 'Greg', age: 21, color: 'blue' }, { name: 'Josh', age: 18, color: 'red' } ];
console.log(filter(arr, {age: 21, color: 'blue'}));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.