为什么我的过滤功能不起作用? (JavaScript)的。

时间:2015-12-16 02:47:19

标签: javascript filter functional-programming higher-order-functions

我想要完成的任务,能够使用过滤功能过滤掉年龄为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' }));

4 个答案:

答案 0 :(得分:3)

无法将对象与===

进行比较

Testing objects equality in NodeJS

您应该在for-loop

之外添加return

答案 1 :(得分:3)

MyDestinationViewController *toVC = segue.destinationViewController;
MyCustomizedTransitioningDelegate *transitioningDelegate = [[MyCustomizedTransitioningDelegate alloc]init];
toVC.transitioningDelegate = transitioningDelegate;

答案 2 :(得分:2)

你的解决方案不起作用的原因是因为你无法使用相等运算符比较两个对象,所以你必须实际比较对象的属性,使用像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;
};

答案 3 :(得分:1)

您必须遍历数组中的这些对象并测试其属性和属性值。这是一种向后兼容的方式:

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'}));