javascript .filter()数组不起作用

时间:2017-11-08 15:52:02

标签: javascript angularjs

我正在研究一个angularjs控制器并尝试过滤一个对象而不确定我在这里做错了什么。

我有一个包含以下内容的对象:

[
    {
    "id": 1,
    "is_new": true,
    "shielded": false,
    "favicon" : "images/favicon.png",
    "created": "2017-10-18T19:15:07.118477Z",
    "email_domain": "domain.com",
    "sender_name": null,
    "sender_email": "xxx@domain.com"
    },{
    "id": 2,
    "is_new": true,
    "shielded": true,
    "favicon" : "images/favicon.png",
    "created": "2017-10-18T19:15:06.765423Z",
    "email_domain": "domain.com",
    "sender_name": null,
    "sender_email": "xxx@domain.com"
    }
]

我的控制器是这样的:

app.controller('emailController', function($scope, Emails) {
    Emails.getItems().then(function(response) {
        $scope.emails = response.data;
        //$scope.grouped = group($scope.emails);
        $scope.inboxed = inbox($scope.emails);

        /*function group(arr) {
            var grouped = {};
            arr.forEach(item => {
                var grp = item.sender_email[0]
                grouped[grp] = grouped[grp] || [];
                grouped[grp].push(item);
            })
            return grouped;
        }*/

        function inbox(arr) {
            var inboxed = arr;
            inboxed.filter(function(eval) {
                eval.shielded === false;
                console.log(eval.shielded);
                return eval;
            });
            return inboxed;
        }
    })
});

所以当我在上面运行这个脚本,并检查console.lo时,该函数返回对象中的两个数组,而不是只过滤屏蔽等于false的数组。也许只是语法错误?

4 个答案:

答案 0 :(得分:1)

您的代码正在执行以下操作:

function inbox(arr) {
    // create a new variable that refers to the same array as arr
    var inboxed = arr;

    // filter inboxed and do nothing with the filtered result
    inboxed.filter(function(eval) {
        // evaluate eval.shielded === false and do nothing with the result
        eval.shielded === false;
        // log eval.shielded to the console
        console.log(eval.shielded);
        // return eval, which is truthy, so the item being checked will pass the filter
        return eval;
    });

    // return the unmodified array
    return inboxed;
 }

你可能想做的是:

function inbox(arr) {
    return arr.filter(function(eval) {
        return !eval.shielded;
    });
}

答案 1 :(得分:0)

filter函数返回一个已过滤的新数组,并且不会改变现有数组:

function inbox(arr) {
    // return the result of calling filter >>>
    return arr.filter(function(eval) {
        eval.shielded === false;
        console.log(eval.shielded);
        return eval;
    });

}

答案 2 :(得分:0)

对我来说看起来像语法错误 - 你正在返回eval条目本身,而不是布尔值。您必须返回一个布尔值来过滤掉一些东西。我认为一切都会回归,因为任何价值本身都是“真实的”。

即。改变它:

inboxed.filter(function(eval) {
  eval.shielded === false;
  console.log(eval.shielded);
  return eval;
});

这样的事情:

inboxed.filter(function(eval) {
  console.log(eval.shielded);
  return eval.shielded === false;
});

另请注意,如果我是正确的,您的inboxed变量仍会修改arr。更好的做法是slice创建一个全新的阵列,然后两者都可以被操纵而不会相互影响。

var inboxed = arr.slice();

希望有效!

答案 3 :(得分:-1)

问题是你要归还inboxed它应该看起来像这样:

  function inbox(arr) {
      inboxed == arr.filter(function(eval) {
          eval.shielded === false;
          console.log(eval.shielded);
          return eval;
      });
      return inboxed;
  }

你的功能只会返回原始数组,但是当你记录时,你会看到你想要看到的结果。 filter不会改变原始数组,它会在被调用的数组上执行,但如果变量没有指向该返回值,它将在执行后立即丢失。