我正在研究一个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的数组。也许只是语法错误?
答案 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
不会改变原始数组,它会在被调用的数组上执行,但如果变量没有指向该返回值,它将在执行后立即丢失。